Python - 我可以使用 lambda 函数通过 tkinter 生成重复的 GUI 吗? (labels/text/buttons)
Python - Can I use a lambda function to generate a repetitive GUI with tkinter? (labels/text/buttons)
我有一个非常重复的 GUI 需要实现 - 想想数十个 label/text/button 字段,用于数据输入表单。每个重复部分的大小可以相同 - 事实上,除了标签中的文本和文本字段中的数据在完成时分配给的变量之外,其他所有内容都可以相同。
我曾与一位使用 lambda 函数以非常复杂的方式生成子函数的工程师合作过,我 几乎 遵循了这种方式,但不是 100%。我希望,因为这是一个类似的,主要是重复性的任务,所以有一些方法可以使用公式函数为我重复 GUI 创建工作,而不是必须输入每个 GUI 项目。
一个函数是否可以生成重复的 GUI 元素?如果是,那是 lambda 函数吗?或者是否有不同的(或更好的)方法来完成同样的事情 "not repeating myself"?
Is it possible to have repetitive GUI elements generated by a function, and if so, is that a lambda function?
是的,可以使用函数创建 gui 元素,不,它不是 lambda 函数。在函数中创建 gui 元素不仅是可能的,而且可以说是最佳实践,尽管您也可以只使用简单的循环或常规函数。
在创建以某种方式捆绑在一起的小部件组时,最好创建一个自定义 class,它可以封装所有行为并为程序的其余部分提供一个简单的界面。
例子
在下面的示例中,我们要创建一系列带有标签、条目和提交按钮的小部件。它将作为 class 实现,因为我们实际上是在创建一个表示一个表单域的对象。
注意:以下代码假定您使用 import tkinter as tk
.
导入了 tkinter
首先,让我们创建一个回调,在字典中设置一个值,并打印出该值以供调试。回调将被赋予字段名称,以及用户输入的值:
data = {}
def handle_submit(name, value):
print("you submitted '%s' for %s" % (value, name))
data[name] = value
接下来,创建 10 个项目的代码可能如下所示:
root = tk.Tk()
for i in range(1, 11):
field_name = "field %s" % i
row = CustomWidget(root, name=field_name, callback=handle_submit)
最后,我们需要创建 class。我们继承自 tk.Frame
以便我们可以像使用任何其他 tkinter 小部件一样使用它。它需要为其父项、字段名称和用户按下提交时调用的函数获取参数:
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())
我有一个非常重复的 GUI 需要实现 - 想想数十个 label/text/button 字段,用于数据输入表单。每个重复部分的大小可以相同 - 事实上,除了标签中的文本和文本字段中的数据在完成时分配给的变量之外,其他所有内容都可以相同。
我曾与一位使用 lambda 函数以非常复杂的方式生成子函数的工程师合作过,我 几乎 遵循了这种方式,但不是 100%。我希望,因为这是一个类似的,主要是重复性的任务,所以有一些方法可以使用公式函数为我重复 GUI 创建工作,而不是必须输入每个 GUI 项目。
一个函数是否可以生成重复的 GUI 元素?如果是,那是 lambda 函数吗?或者是否有不同的(或更好的)方法来完成同样的事情 "not repeating myself"?
Is it possible to have repetitive GUI elements generated by a function, and if so, is that a lambda function?
是的,可以使用函数创建 gui 元素,不,它不是 lambda 函数。在函数中创建 gui 元素不仅是可能的,而且可以说是最佳实践,尽管您也可以只使用简单的循环或常规函数。
在创建以某种方式捆绑在一起的小部件组时,最好创建一个自定义 class,它可以封装所有行为并为程序的其余部分提供一个简单的界面。
例子
在下面的示例中,我们要创建一系列带有标签、条目和提交按钮的小部件。它将作为 class 实现,因为我们实际上是在创建一个表示一个表单域的对象。
注意:以下代码假定您使用 import tkinter as tk
.
首先,让我们创建一个回调,在字典中设置一个值,并打印出该值以供调试。回调将被赋予字段名称,以及用户输入的值:
data = {}
def handle_submit(name, value):
print("you submitted '%s' for %s" % (value, name))
data[name] = value
接下来,创建 10 个项目的代码可能如下所示:
root = tk.Tk()
for i in range(1, 11):
field_name = "field %s" % i
row = CustomWidget(root, name=field_name, callback=handle_submit)
最后,我们需要创建 class。我们继承自 tk.Frame
以便我们可以像使用任何其他 tkinter 小部件一样使用它。它需要为其父项、字段名称和用户按下提交时调用的函数获取参数:
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())