【问题标题】:How to structure tkinter for a single window with multiple frames with multiple buttons inside each frames如何为具有多个框架的单个窗口构建 tkinter,每个框架内有多个按钮
【发布时间】:2020-06-23 08:53:03
【问题描述】:

我正在尝试熟悉 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()

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

我的问题是,如果我应该使用类,我应该如何划分类?我应该将每个帧与其中的元素分开作为一个对象,还是其他什么?

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

【问题讨论】:

  • 我认为this post 是您要找的。​​span>

标签: python class oop tkinter


【解决方案1】:

您可能应该为每个组使用一个类。最常见的方法是让类继承自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()

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


在我写完这个答案后,你修改了你的问题,说“我的问题是,当框架之间的唯一相似之处是框架本身和标签,而不是其他时,是否需要使用类。” p>

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

【讨论】:

  • 每一帧都有一个标签,但是不同类型的小部件,例如,frame1有“选择文件按钮”,frame2有复选框,frame3有下拉菜单。我认为使用类会使事情变得过于复杂,因为每个框架中唯一存在的就是框架本身。但是,不使用类会使其看起来不那么专业
  • @wowzaaa:“每个框架中唯一存在的东西就是框架本身”是什么意思?你说每个框架都有不同类型的按钮。这两种说法是矛盾的。您还写了您认为 OOP 是正确的选择,所以我给出了基于 OOP 的答案。
  • 很抱歉造成混淆,看来我也对自己的问题感到困惑。我的意思是每个框架都有一个小部件和一个标签,并且需要小部件的返回值,但是框架之间的小部件不同。我认为使用 OOP 可能是合适的,因为许多 tkinter 实现是在类中构建的,现在我认为它可以部分地围绕为框架、标签和获取小部件的返回值实例化类来构建。你怎么看待这件事?抱歉,如果这令人困惑,我是 tkinter 的新用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多