tkinter从菜单显示新帧

时间:2018-11-15 15:32:51

标签: python checkbox tkinter dynamic frame

我正在尝试用python&tkinter编写fisrt脚本。

从菜单栏按钮单击时,我阻止显示来自功能( def onDisplay )的新帧,但未追加任何内容。 没有显示错误:-(

新框架由文本文件中的动态复选框组成: txt文件:

item1
item2
...
item100

GUI的屏幕:

enter image description here

这是我的代码:

from tkinter import Tk, Frame, Menu, Checkbutton, Text, TOP, BOTH, X, N, LEFT, BooleanVar
from tkinter.ttk import Frame, Label, Entry
import glob

class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()
        #self.display_srv()

    def initUI(self):

        self.master.title("Submenu")

        menubar = Menu(self.master)
        self.master.config(menu=menubar)

        fileMenu = Menu(menubar)

        submenu = Menu(fileMenu)
        submenu.add_command(label="lst1", command=self.onDisplay)
        submenu.add_command(label="lst2")
        submenu.add_command(label="lst3")
        fileMenu.add_cascade(label='Listing', menu=submenu, underline=0)

        fileMenu.add_separator()

        fileMenu.add_command(label="Exit", underline=0, command=self.onExit)
        menubar.add_cascade(label="File", underline=0, menu=fileMenu)

    #The frame i tried to display
    def onDisplay(self):
        self.master.title("display it")
        self.pack(fill=BOTH, expand=True)
        frame1 = Frame(self)
        frame1.pack(fill=X)
        path = '/root/liste/*.txt'
        files=glob.glob(path)
        count = 0
        for file in files:
            with open(file, 'r') as lst_file:
                for item in lst_file:
                    # Need to split all item by 10
                    Checkbutton(self, text=item.rstrip()).grid(row=count//10, column=count%10)
                    count += 1


    def onClick(self):
        if self.var.get() == True:
            self.master.title("Checkbutton")
        else:
            self.master.title("")

    def onExit(self):

        self.quit()


def main():

    root = Tk()
    root.geometry("850x550+300+300")
    app = Example()
    root.mainloop()


if __name__ == '__main__':

非常感谢您的帮助

此致

2 个答案:

答案 0 :(得分:0)

主要问题是您在同一父容器中混合了gridpack。您在pack上调用frame1,但在复选按钮上调用grid,它们的主节点或父节点均为self

那是行不通的,因为gridpack中的每一个都将尝试根据其规则调整容器的大小,触发另一个容器按照其规则进行重新配置,依此类推,直到时间结束。

因此,只需将选中按钮上的.grid(...)的呼叫更改为.pack(...)即可解决此问题。

我的猜测是您打算将复选按钮放在frame1内。在这种情况下,您需要将frame1指定为复选按钮的主菜单。为了便于阅读和调试,我还建议将对grid的调用放在单独的行上。这样,您就可以继续将grid用于复选按钮,并将pack用于其他所有内容。

cb = Checkbutton(frame1, text=item.rstrip())
cb.grid(row=count//10, column=count%10)

答案 1 :(得分:0)

我发布了正确的代码:

bits/stdc++.h