1

我正在学习用 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 类中使用嵌套类而不是方法来构建 GUI 是否是一种更好的方法。
4

1 回答 1

1

如果您希望标签与条目小部件具有完全相同的文本,到目前为止最简单的解决方案是让它们共享相同的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()

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

截屏

至于关于使用嵌套类的问题,不,它们无济于事。几乎没有时候嵌套类比在全局范围内定义类更好。嵌套使代码的编写和理解更加复杂,同时提供的额外价值很少。

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

于 2020-11-28T15:45:10.840 回答