Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基本方法和GUI辅助_Python_User Interface_Methods_Tkinter - Fatal编程技术网

Python 基本方法和GUI辅助

Python 基本方法和GUI辅助,python,user-interface,methods,tkinter,Python,User Interface,Methods,Tkinter,我对编程是完全陌生的,如果涉及到Python本身,我是绿色的。我几天前开始学习,我需要一些帮助来理解和简化我的代码。我正在开发一个简单的GUI,这是我创建的。一切正常,但我想知道如何将tkinter按钮小部件与方法混合使用,这样我就不必每次创建新小部件时都创建不同的小部件。这应该包括变量值,但这对我来说很难理解,这就是我来这里寻求帮助的原因。谢谢你的帮助;D 这里我发布的是缩短版,原版包括10个按钮,所以你可以想象这看起来有多糟糕 import Tkinter as tk def __in

我对编程是完全陌生的,如果涉及到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()

我建议为你的按钮制作一个课程,课程上有大量的教程,这里有一个对我很有帮助:


通常的方法是使用默认参数定义一个短回调包装函数,该函数依次使用所需的参数调用实际事件处理程序函数。下面是一个基于您的代码的示例:

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是如何做到这一点的,我也不知道在手动创建标签时如何使用这些代码,这些标签有自己不同的文本值。对不起,我缺乏知识,但我觉得这是我唯一能学到的方法。请看更新的答案,我已经试着回答了你的问题。