我正在尝试熟悉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()
如果每个帧都相同,则可以创建一个基类,所有其他帧都继承自该基类。如果它们都不同,则不需要基类。即使框架几乎没有任何共同点,使用类也是在逻辑上将一组小部件视为单个对象的好方法。
在我写完这个答案后,你修改了你的问题,说"我的问题是,当帧之间唯一的相似之处是帧本身和标签,而不是别的,而不是别的时,是否有必要使用类。
相似性不是问题。类是有用的,无论它们是否共享一个共同的基础。类可以将一组相关功能封装到单个实体中。