代码之家  ›  专栏  ›  技术社区  ›  user3.1415927

Python-我可以使用lambda函数生成一个带有tkinter的重复GUI吗(标签/文本/按钮)

  •  0
  • user3.1415927  · 技术社区  · 7 年前

    我有一个非常重复的GUI要实现——想想一个数据输入表单的几十个标签/文本/按钮字段。每个重复部分的大小可以相同-事实上,除了标签中的文本和文本字段中的数据在完成时分配给的变量外,所有内容都可以相同。

    几乎 紧随其后,但不是100%。我希望,因为这是一个类似的,主要是重复性的任务,有某种方法可以使用公式化的函数为我重复GUI创建工作,而不是必须键入每个GUI项。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Bryan Oakley    7 年前

    一个函数是否有可能生成重复的GUI元素,如果有,那是lambda函数吗?

    是的,可以用函数创建gui元素,不,它不是lambda函数。在函数中创建gui元素不仅是可能的,而且可以说是一种最佳实践,尽管您也可以只使用简单的循环或常规函数。

    在创建以某种方式绑定在一起的小部件组时,最好创建一个自定义类,该类可以封装所有的行为,并为程序的其余部分提供一个简单的接口。

    例子

    在下面的示例中,我们希望创建一系列具有标签、条目和提交按钮的小部件。它将被实现为一个类,因为我们实际上是在创建一个表示一个表单字段的对象。

    注意:下面的代码假设您使用 import tkinter as tk .

    首先,让我们创建一个回调,在字典中设置一个值,并打印出该值以进行调试。回调将提供字段的名称和用户输入的值:

    data = {}
    def handle_submit(name, value):
        print("you submitted '%s' for %s" % (value, name))
        data[name] = value
    

    root = tk.Tk()
    for i in range(1, 11):
        field_name = "field %s" % i
        row = CustomWidget(root, name=field_name, callback=handle_submit)
    

    最后,我们需要创建我们的类。我们继承自 tk.Frame

    class CustomWidget(tk.Frame):
        def __init__(self, parent, name, callback):
            tk.Frame.__init__(self, parent)
    
            self.name = name
            label_text = name.title() + ":"
            self.callback = callback
            self.label = tk.Label(self, text=label_text, anchor="e")
            self.entry = tk.Entry(self)
            self.button = tk.Button(self, text="Submit", command=self.submit)
    
            self.button.pack(side="right")
            self.label.pack(side="left")
            self.entry.pack(side="left", fill="x", expand=True)
    
        def submit(self):
            self.callback(self.name, self.entry.get())