基本方法和 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 的教程,这里有一个对我帮助很大:

https://www.youtube.com/watch?v=trOZBgZ8F_c

通常的做法是定义一个带有默认参数的简短回调包装函数,该函数依次使用所需的参数调用真正的事件处理函数。这是一个基于您的代码的示例:

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()