首页 > 解决方案 > tkinter Python 中不可见的按钮和表格

问题描述

我试图通过画布添加滚动条,并在画布中添加了一个名为frametwo的框架。我在该框架中添加了几个按钮和一个表格,但什么都看不到。如果我在根目录中添加所有这些东西,那么它们就会变得可见。我尝试了不同的东西,但没有任何效果。这是我写的代码

import myvariant
from tkinter import ttk
from tkinter import *
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from pandas import DataFrame
from PIL import ImageTk, Image

rsid_list=[8,9,5,5]

mv = myvariant.MyVariantInfo()


def main():
    main_window = Tk()
    app = info(main_window)
    main_window.mainloop()

class info:
    def __init__(self, root):
        self.root = root
        self.root.title('VCESS-ExAC')

        self.root.geometry('1600x800+0+0')

        self.root.configure(background='light grey')

        main_frame = Frame(self.root)
        main_frame.pack(fill=BOTH, expand=1, padx=0, pady=0)
        main_frame.place(x=0, y=0, width=1600, height=800)

        my_canvas = Canvas(main_frame)
        my_canvas.pack(side=LEFT, fill=BOTH, expand=1)

        my_scroll = ttk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
        my_scroll.pack(side=RIGHT, fill=Y)

        my_canvas.configure(yscrollcommand=my_scroll.set)
        my_canvas.bind('<Configure>', lambda e: my_canvas.config(scrollregion=my_canvas.bbox(ALL)))

        self.frametwo = Frame(my_canvas)

        my_canvas.create_window((0, 0), window=self.frametwo, anchor='nw')

        table1 = LabelFrame(self.root, text="Retreived Data")  ################
        table1.pack(fill="both", expand="yes", padx=0, pady=0)  ###################
        table1.place(x=40, y=250, width=250, height=380)
        table = ttk.Treeview(table1, height="8")  #################

        table['columns'] = ['rsID']
        table.column('#0', width=120, minwidth=25)
        table.column('rsID', anchor=W, width=120)

        table.heading('#0', text='Serial No.', anchor=W)
        table.heading('rsID', text='rsID', anchor=W)

        for i in range(len(rsid_list)):
            table.insert(parent='', index='end', iid=i, text=i + 1,
                         values=(rsid_list[i]))



        table.place(x=0, y=0)  ##########################
        # VERTICAL SCROLLBAR
        yscrollbar = ttk.Scrollbar(table1, orient=VERTICAL, command=table.yview)  #############
        yscrollbar.pack(side=RIGHT, fill='y')  ##################

        # HORIZONTAL SCROLLBAR
        xscrollbar = ttk.Scrollbar(table1, orient=HORIZONTAL, command=table.xview)  ###################
        xscrollbar.pack(side=BOTTOM, fill='x')  #######################

        table.configure(yscrollcommand=yscrollbar.set, xscrollcommand=xscrollbar.set)  ##############
        table.pack(side=LEFT)
        btn_download = Button(self.frametwo, text='Save File',
                              font=("Times New Roman", 14, 'bold'), bd=3, relief=RIDGE,
                              cursor='hand2', bg='#154857', fg='white', activeforeground='white',
                              activebackground='#154857')
        btn_download.place(x=190, y=640, width=120)

        btn_graph = Button(self.frametwo, text='Graph',
                           font=("Times New Roman", 14, 'bold'), bd=3, relief=RIDGE,
                           cursor='hand2', bg='#154857', fg='white', activeforeground='white',
                           activebackground='#154857')

        btn_graph.place(x=530, y=640, width=120)

if __name__ == '__main__':
    main()


期待任何可能的解决方案。

标签: pythontkinterpython-requeststkinter-canvastkinter-layout

解决方案


你已经在里面创建了按钮self.frametwo。您正在使用place,这意味着按钮不会影响框架的大小。由于您没有给出self.frametwo尺寸,它默认为 1 像素宽和 1 像素高。因此,框架本质上是不可见的,因此框架内的所有按钮都是不可见的。

pack您可以通过切换到使用或grid按钮轻松看到这一点。当您使用packorgrid时,默认情况下父框架将增长或缩小以适应其子框架。因此,将其中任何一个用于按钮都会导致框架变得足够大以显示按钮。

我正在添加......该框架中的一个表格,但什么都看不到。

您没有将表格添加到框架中,而是将其添加到根窗口。如果要将其添加到框架中,则必须将框架用作其父级。同样,您可能不应该使用place. place除非您准备做很多额外的工作来确保小部件可见并响应小部件大小、字体大小、显示分辨率等的变化,否则这几乎永远不是正确的选择。


推荐阅读