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 上调用 pack
、place
或 grid
,以便它们出现。
此外,您需要为标签框架指定一个尺寸或在其中放置一个或多个小部件。否则,帧将是 1x1 像素,几乎无法看到。
最后,如果您只将一个小部件放在框架中,例如将标签框架放在 self
中,使用 pack
比 grid
更容易,因为你可以用一个命令让它填充框架,而不必记住给行和列赋予权重。
这是包含所有这些更改的代码:
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()
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 上调用 pack
、place
或 grid
,以便它们出现。
此外,您需要为标签框架指定一个尺寸或在其中放置一个或多个小部件。否则,帧将是 1x1 像素,几乎无法看到。
最后,如果您只将一个小部件放在框架中,例如将标签框架放在 self
中,使用 pack
比 grid
更容易,因为你可以用一个命令让它填充框架,而不必记住给行和列赋予权重。
这是包含所有这些更改的代码:
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()