如何为具有多个框架的单个窗口构建 tkinter,每个框架内有多个按钮



我正在尝试熟悉tkinter,我创建了一个虚拟的"应用程序",它有多个框架,每个框架中有多个小部件。

例如:

import tkinter as tk
if __name__ == "__main__":
window = Tk()
window.title("somename")
window.geometry("400x400")
frame1 = tk.Frame(window) 
frame1.grid(row = 0, column = 0) 
label1 = tk.Label(frame1, text = "this is frame1") 
label1.pack() 
button1 = tk.Button(frame1) 
button1.pack()
frame2 = tk.Frame(window) 
frame2.grid(row = 1, column = 0) 
label2 = tk.Label(frame2, text = "this is frame2") 
label2.pack() 
button2 = tk.Button(frame2) 
button2.pack()

到目前为止,这种格式是有效的,但是它非常混乱,我还需要使用命令的按钮的返回值(例如来自askopen文件名的文件名,来自CheckButton的值等(,我认为OOP将是一个不错的选择,因为它封装了信息,但是,我不是很熟悉OOP,因为我主要使用python在jupyter中编写脚本。

我的问题是,如果我应该使用类,我应该如何划分类?我应该将每个包含元素的帧作为对象还是其他东西分开?

编辑:我应该说每个框架都有一个标签,但不同类型的小部件。谢谢 Yik @Henry的链接,但我的问题是,当帧之间唯一的相似之处是框架本身和标签,而不是别的,是否有必要使用类。

您可能应该为每个组使用一个类。执行此操作的最常见方法是让类继承自Frame。这使您在尝试布置所有内容时将整个小部件组视为单个复合小部件。

例如,其中一个帧可能如下所示:

class Frame1(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
label1 = tk.Label(self, text = "this is frame1") 
button1 = tk.Button(self) 
label1.pack() 
button1.pack()

请注意,所有子小组件都在self中,而不是在根窗口中。

然后,您可以将此类视为常规小部件。例如:

root = tk.Tk()
frame1 = Frame1(root)
frame1.pack()

如果每个帧都相同,则可以创建一个基类,所有其他帧都继承自该基类。如果它们都不同,则不需要基类。即使框架几乎没有任何共同点,使用类也是在逻辑上将一组小部件视为单个对象的好方法。


在我写完这个答案后,你修改了你的问题,说"我的问题是,当帧之间唯一的相似之处是帧本身和标签,而不是别的,而不是别的时,是否有必要使用类。

相似性不是问题。类是有用的,无论它们是否共享一个共同的基础。类可以将一组相关功能封装到单个实体中。

最新更新