tkinter 应用程序结构 - 使用 LabelFrames 和 Class

tkinter application structure - using LabelFrames and Class

Python-这里是 tkinter 初学者...

我想使用此处的面向对象方法用 2 个垂直标签框架(ModeWin 和 StatusWin)填充主要 window (MainWin):Best way to structure a tkinter application?

代码运行但根本没有 labelFrames :-(

import tkinter as tk
#-------------------------------------------------------------------------------
# CLASS
class ModeWin(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self,parent,bg='light blue')
        self.parent = parent
        self.lblFrame = tk.LabelFrame(self.parent, text="Mode", padx=20, pady=20)
        self.lblFrame.grid(row=0, column=0, sticky="ew")
        
        self.label = tk.Label(self.lblFrame, text="Text in ModeWin")
        self.lblFrame.grid()

class StatusWin(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self,parent,bg='light green')
        self.parent = parent
        self.lblFrame = tk.LabelFrame(self.parent, text="Status", padx=20, pady=20)
        self.lblFrame.grid(row=1, column=0, sticky="ew")

        self.label = tk.Label(self.lblFrame, text="Text in StatusWin")
        self.lblFrame.grid()
    
class MainWin(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.modeWin = ModeWin(self)
        self.statusWin = StatusWin(self)
        
    def start(self):
        self.mainloop()
        
#-------------------------------------------------------------------------------
# MAIN
def main():
    app = MainWin()
    app.start()

if __name__ == '__main__':
    main()

非常感谢您的建议。 提前谢谢你

作为从框架继承时的一般经验法则,所有子部件都应该是 class 本身的子部件,而不是其父部件。否则,从框架 class 继承的优势为零。换句话说,将标签框架设为 self 而不是 self.parent.

然后您需要在您的 class 上调用 packplacegrid,以便它们出现。

此外,您需要为标签框架指定一个尺寸或在其中放置一个或多个小部件。否则,帧将是 1x1 像素,几乎无法看到。

最后,如果您只将一个小部件放在框架中,例如将标签框架放在 self 中,使用 packgrid 更容易,因为你可以用一个命令让它填充框架,而不必记住给行和列赋予权重。

这是包含所有这些更改的代码:

import tkinter as tk
#-------------------------------------------------------------------------------
# CLASS
class ModeWin(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self,parent,bg='light blue')
        self.parent = parent
        self.lblFrame = tk.LabelFrame(self, text="Mode", padx=20, pady=20)
        self.lblFrame.pack(fill="both", expand=True)

        self.label = tk.Label(self.lblFrame, text="Text in ModeWin")
        self.label.pack(side="top")

class StatusWin(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self,parent,bg='light green')
        self.parent = parent
        self.lblFrame = tk.LabelFrame(self, text="Status", padx=20, pady=20)
        self.lblFrame.pack(fill="both", expand=True)

        self.label = tk.Label(self.lblFrame, text="Text in StatusWin")
        self.label.pack(side="top")

class MainWin(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.modeWin = ModeWin(self)
        self.statusWin = StatusWin(self)

        self.modeWin.grid(row=0, column=0, sticky="ew")
        self.statusWin.grid(row=1, column=0, sticky="ew")

    def start(self):
        self.mainloop()

#-------------------------------------------------------------------------------
# MAIN
def main():
    app = MainWin()
    app.start()

if __name__ == '__main__':
    main()