Python 基本方法和GUI辅助
我对编程是完全陌生的,如果涉及到Python本身,我是绿色的。我几天前开始学习,我需要一些帮助来理解和简化我的代码。我正在开发一个简单的GUI,这是我创建的。一切正常,但我想知道如何将tkinter按钮小部件与方法混合使用,这样我就不必每次创建新小部件时都创建不同的小部件。这应该包括变量值,但这对我来说很难理解,这就是我来这里寻求帮助的原因。谢谢你的帮助;D 这里我发布的是缩短版,原版包括10个按钮,所以你可以想象这看起来有多糟糕Python 基本方法和GUI辅助,python,user-interface,methods,tkinter,Python,User Interface,Methods,Tkinter,我对编程是完全陌生的,如果涉及到Python本身,我是绿色的。我几天前开始学习,我需要一些帮助来理解和简化我的代码。我正在开发一个简单的GUI,这是我创建的。一切正常,但我想知道如何将tkinter按钮小部件与方法混合使用,这样我就不必每次创建新小部件时都创建不同的小部件。这应该包括变量值,但这对我来说很难理解,这就是我来这里寻求帮助的原因。谢谢你的帮助;D 这里我发布的是缩短版,原版包括10个按钮,所以你可以想象这看起来有多糟糕 import Tkinter as tk def __in
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()
我建议为你的按钮制作一个课程,课程上有大量的教程,这里有一个对我很有帮助:
通常的方法是使用默认参数定义一个短回调包装函数,该函数依次使用所需的参数调用实际事件处理程序函数。下面是一个基于您的代码的示例:
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的文本都是通过
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')
而是在循环中
另请参见另一个示例。实现所需功能的面向对象方法是创建一个包含一个或多个GUI小部件的类,并定义对其进行操作的方法。被认为是一种更先进的技术,但使用它将使以后修改和增强程序变得更容易 例如,您可以将背景颜色设置为一个变量,而不是将其硬编码为“红色”,只需在_init___方法中添加另一个参数,并在创建实例时为其传递一个值即可 下面的操作与您的脚本和我的脚本相同。MyWidget的每个实例中的tk.Button在单击该实例时将调用该实例的_call__方法,因为创建该按钮时使用了命令=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()
非常感谢,这会让事情变得明朗一点。但是你能解释一下tkinter从哪里获取按钮编号值吗?因为当我“手动”创建标签时,我总是为“按钮”指定不同的名称,我不知道Python是如何做到这一点的,我也不知道在手动创建标签时如何使用这些代码,这些标签有自己不同的文本值。对不起,我缺乏知识,但我觉得这是我唯一能学到的方法。请看更新的答案,我已经试着回答了你的问题。