如果涉及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()
答案 0 :(得分:0)
我建议为你的按钮上课,有很多关于课程的教程,这里有一个真正帮助我的课程:
答案 1 :(得分:0)
执行此操作的常用方法是使用默认参数定义一个简短的回调包装函数,该函数依次使用所需的参数调用实际事件处理函数。以下是基于您的代码的示例:
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以获取其他示例。
答案 2 :(得分:0)
以面向对象的方式执行您想要的操作是创建一个包含一个或多个GUI小部件的类,并定义对其进行操作的方法。它被认为是一种更高级的技术,但使用它将使以后更容易修改和增强您的程序。
例如,您可以将背景颜色设置为变量,而不是通过向'red'
方法添加另一个参数并在创建实例时为其传递值来将其硬编码为__init__()
。 / p>
以下内容与您的脚本(以及我的other answer)相同。 tk.Button
的每个实例中的MyWidget
会在点击该实例的__call__()
方法时调用该command=self.__call__
方法,因为Button
参数在{ {1}}已创建。
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()