Tkinter OOP原理,是使用方法好还是嵌套好类

Tkinter OOP principle, is it better to use methods or nested classes

我正在学习使用 GUI 编写程序,但我无法理解最佳原理。

目前我正在尝试拥有 5 个条目,写入条目的文本会自动更新为标签。到目前为止,这是我的代码:

import tkinter as tk


class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
    
        # GUI starts here

        self.label = tk.Label(parent, text="Give values")
        self.label.grid(row="1")

        self.entries()
        self.labels()

    def entries(self):
        for i in range(5):
            number1 = tk.StringVar()
            entry = tk.Entry(textvariable=number1)
            entry.grid(row=3, column=i)

            result = entry.get()
            return result

    def labels(self,):
        for i in range(5):
            label = tk.Label(self.parent, text=self.entries(), width=17, borderwidth=2, relief="groove")
            label.grid(row=4, column=i)

if __name__ == "__main__":
    root = tk.Tk()
    root.geometry("1280x800")
    MainApplication(root).grid()
    root.mainloop()

我的代码输出如下。显然,很多事情都是错误的,因为我没有得到五个输入框,而且它们不会自动更新到下面的标签。

我有两个问题:

  1. 如何修复我的代码以获得想要的输出
  2. 在我的 MainApplication class 中使用嵌套的 classes 而不是方法来构建 GUI 会是更好的方法吗?

如果您希望标签与条目小部件具有完全相同的文本,目前最简单的解决方案是让它们共享相同的 textvariable

这是一个基本示例。当您 运行 它然后输入任何条目时,该值会立即显示在它下面的标签中。

import tkinter as tk

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self,parent, *args, **kwargs)
        self.parent = parent

        self.label = tk.Label(parent, text="Give values")
        self.label.grid(row=1)

        for column in range(5):
            var = tk.StringVar()
            entry = tk.Entry(root, textvariable=var)
            label = tk.Label(root, textvariable=var, width=17)

            entry.grid(row=2, column=column, sticky="ew")
            label.grid(row=3, column=column, sticky="ew")


if __name__ == "__main__":
    root = tk.Tk()
    root.geometry("1280x800")
    MainApplication(root).grid()
    root.mainloop()

我通常不提倡对 Entry 小部件使用特殊的 tkinter 变量,但这是一个很好的例子,说明它何时是完成工作的正确工具。

至于使用嵌套的问题类,不,他们帮不上忙。嵌套 类 几乎从来没有比在全局范围内定义 类 更好的时候。嵌套使代码更难编写和理解,同时提供的额外价值很少。

嵌套 类 在非常特殊的情况下很有用,但通常不应该使用。