基本方法和 GUI 帮助
Basic methods & GUI assistance
如果涉及到 Python 本身,我对编程和绿色完全陌生。我几天前开始学习,我需要一些帮助来理解和简化我的代码。我正在开发一个我创建的简单 GUI。一切正常,但我想知道如何将 tkinter 按钮小部件与方法混合,这样我就不必在每次创建新小部件时都创建不同的小部件。这应该包括变量值,但这对我来说很难理解,这就是我来这里寻求帮助的原因。感谢所有的帮助;D
在这里我发布了简化版,原版包含 10 个按钮所以你可以想象这看起来有多糟糕
import Tkinter as tk
def __init__(master):
frame = Frame(master)
frame.pack()
def toggle_text():
if button["text"] == "WL":
button["text"] = "WYL"
label["bg"] = "green"
else:
button["text"] = "WL"
label["bg"] = "red"
def toggle_text1():
if button1["text"] == "WL":
button1["text"] = "WYL"
label1["bg"] = "green"
else:
button1["text"] = "WL"
label1["bg"] = "red"
def toggle_text2():
if button2["text"] == "WL":
button2["text"] = "WYL"
label2["bg"] = "green"
else:
button2["text"] = "WL"
label2["bg"] = "red"
root = tk.Tk()
root.title("GUI - TEST")
button = tk.Button( text="WL", width=12, command=toggle_text, bg='red')
button.grid(row=0, column=1)
label = tk.Label(bg='red', width=6, text='1')
label.grid(row=0, column=2)
button1 = tk.Button( text="WL", width=12, command=toggle_text1, bg='red')
button1.grid(row=1, column=1)
label1 = tk.Label(bg='red', width=6, text='2')
label1.grid(row=1, column=2)
button2 = tk.Button( text="WL", width=12, command=toggle_text2, bg='red')
button2.grid(row=2, column=1)
label2 = tk.Label(bg='red', width=6, text='3')
label2.grid(row=2, column=2)
root.mainloop()
我建议为您的按钮制作一个 class,有很多关于 class 的教程,这里有一个对我帮助很大:
通常的做法是定义一个带有默认参数的简短回调包装函数,该函数依次使用所需的参数调用真正的事件处理函数。这是一个基于您的代码的示例:
import Tkinter as tk
NUM_BUTTONS = 3
button_list = []
label_list = []
def toggle_text(button_num):
button = button_list[button_num]
label = label_list[button_num]
if button['text'] == 'WL':
button['text'] = 'WYL'
label['bg'] = 'green'
else:
button['text'] = 'WL'
label['bg'] = 'red'
root = tk.Tk()
root.title('GUI - TEST')
for i in range(NUM_BUTTONS): # create widgets
def _wrapper(button_num=i): # default argument value is current index
toggle_text(button_num)
button = tk.Button(text='WL', width=12, bg='red', command=_wrapper)
button.grid(row=i, column=1)
button_list.append(button)
label = tk.Label(text=i+1, width=6, bg='red')
label.grid(row=i, column=2)
label_list.append(label)
root.mainloop()
在上面的代码中,每个 tk.Label
的文本是通过
中的 text=i+1
参数设置的
label = tk.Label(text=i+1, width=6, bg='red')
声明。要为每个标签赋予其自己的任意文本值,您可以定义另一个包含每个标签文本的列表,例如:
label_text_list = ['L1', 'L2', 'L3', ...]
然后使用
label = tk.Label(text=label_text_list[i], width=6, bg='red')
在循环中。
另见 Generate Tkinter buttons dynamically 的另一个例子。
一种面向对象的方法是创建一个 class,其中包含一个或多个 GUI 小部件并定义对其进行操作的方法。这被认为是一种更高级的技术,但使用它将使以后修改和增强程序变得更加容易。
例如,您可以将背景颜色设为一个变量,而不是将其硬编码为 'red'
,方法是简单地向 __init__()
方法添加另一个参数并在创建实例时为其传递一个值.
以下内容与您的脚本(以及我的 )执行相同的操作。 MyWidget
的每个实例中的 tk.Button
将在单击时调用该实例的 __call__()
方法,因为创建 Button
时使用了 command=self.__call__
参数。
import Tkinter as tk
NUM_MY_WIDGETS = 3
class MyWidget(object):
def __init__(self, row, column, label_text):
self.button = tk.Button(text='WL', width=12, bg='red',
command=self.__call__)
self.button.grid(row=row, column=column)
self.label = tk.Label(text=label_text, width=6, bg='red')
self.label.grid(row=row, column=column+1)
def __call__(self):
if self.button['text'] == 'WL':
self.button['text'] = 'WYL'
self.label['bg'] = 'green'
else:
self.button['text'] = 'WL'
self.label['bg'] = 'red'
root = tk.Tk()
root.title('GUI - TEST')
widgets = []
for i in range(NUM_MY_WIDGETS): # create widgets
widgets.append(MyWidget(i, 1, i+1))
root.mainloop()
如果涉及到 Python 本身,我对编程和绿色完全陌生。我几天前开始学习,我需要一些帮助来理解和简化我的代码。我正在开发一个我创建的简单 GUI。一切正常,但我想知道如何将 tkinter 按钮小部件与方法混合,这样我就不必在每次创建新小部件时都创建不同的小部件。这应该包括变量值,但这对我来说很难理解,这就是我来这里寻求帮助的原因。感谢所有的帮助;D 在这里我发布了简化版,原版包含 10 个按钮所以你可以想象这看起来有多糟糕
import Tkinter as tk
def __init__(master):
frame = Frame(master)
frame.pack()
def toggle_text():
if button["text"] == "WL":
button["text"] = "WYL"
label["bg"] = "green"
else:
button["text"] = "WL"
label["bg"] = "red"
def toggle_text1():
if button1["text"] == "WL":
button1["text"] = "WYL"
label1["bg"] = "green"
else:
button1["text"] = "WL"
label1["bg"] = "red"
def toggle_text2():
if button2["text"] == "WL":
button2["text"] = "WYL"
label2["bg"] = "green"
else:
button2["text"] = "WL"
label2["bg"] = "red"
root = tk.Tk()
root.title("GUI - TEST")
button = tk.Button( text="WL", width=12, command=toggle_text, bg='red')
button.grid(row=0, column=1)
label = tk.Label(bg='red', width=6, text='1')
label.grid(row=0, column=2)
button1 = tk.Button( text="WL", width=12, command=toggle_text1, bg='red')
button1.grid(row=1, column=1)
label1 = tk.Label(bg='red', width=6, text='2')
label1.grid(row=1, column=2)
button2 = tk.Button( text="WL", width=12, command=toggle_text2, bg='red')
button2.grid(row=2, column=1)
label2 = tk.Label(bg='red', width=6, text='3')
label2.grid(row=2, column=2)
root.mainloop()
我建议为您的按钮制作一个 class,有很多关于 class 的教程,这里有一个对我帮助很大:
通常的做法是定义一个带有默认参数的简短回调包装函数,该函数依次使用所需的参数调用真正的事件处理函数。这是一个基于您的代码的示例:
import Tkinter as tk
NUM_BUTTONS = 3
button_list = []
label_list = []
def toggle_text(button_num):
button = button_list[button_num]
label = label_list[button_num]
if button['text'] == 'WL':
button['text'] = 'WYL'
label['bg'] = 'green'
else:
button['text'] = 'WL'
label['bg'] = 'red'
root = tk.Tk()
root.title('GUI - TEST')
for i in range(NUM_BUTTONS): # create widgets
def _wrapper(button_num=i): # default argument value is current index
toggle_text(button_num)
button = tk.Button(text='WL', width=12, bg='red', command=_wrapper)
button.grid(row=i, column=1)
button_list.append(button)
label = tk.Label(text=i+1, width=6, bg='red')
label.grid(row=i, column=2)
label_list.append(label)
root.mainloop()
在上面的代码中,每个 tk.Label
的文本是通过
text=i+1
参数设置的
label = tk.Label(text=i+1, width=6, bg='red')
声明。要为每个标签赋予其自己的任意文本值,您可以定义另一个包含每个标签文本的列表,例如:
label_text_list = ['L1', 'L2', 'L3', ...]
然后使用
label = tk.Label(text=label_text_list[i], width=6, bg='red')
在循环中。
另见 Generate Tkinter buttons dynamically 的另一个例子。
一种面向对象的方法是创建一个 class,其中包含一个或多个 GUI 小部件并定义对其进行操作的方法。这被认为是一种更高级的技术,但使用它将使以后修改和增强程序变得更加容易。
例如,您可以将背景颜色设为一个变量,而不是将其硬编码为 'red'
,方法是简单地向 __init__()
方法添加另一个参数并在创建实例时为其传递一个值.
以下内容与您的脚本(以及我的 MyWidget
的每个实例中的 tk.Button
将在单击时调用该实例的 __call__()
方法,因为创建 Button
时使用了 command=self.__call__
参数。
import Tkinter as tk
NUM_MY_WIDGETS = 3
class MyWidget(object):
def __init__(self, row, column, label_text):
self.button = tk.Button(text='WL', width=12, bg='red',
command=self.__call__)
self.button.grid(row=row, column=column)
self.label = tk.Label(text=label_text, width=6, bg='red')
self.label.grid(row=row, column=column+1)
def __call__(self):
if self.button['text'] == 'WL':
self.button['text'] = 'WYL'
self.label['bg'] = 'green'
else:
self.button['text'] = 'WL'
self.label['bg'] = 'red'
root = tk.Tk()
root.title('GUI - TEST')
widgets = []
for i in range(NUM_MY_WIDGETS): # create widgets
widgets.append(MyWidget(i, 1, i+1))
root.mainloop()