2015-04-22 37 views
1

如果涉及到Python本身,我完全不熟悉编程和绿色。我几天前开始学习,我需要一些帮助理解并简化代码。我正在创建一个简单的GUI,这是我创建的。一切正常,但我想知道如何将tkinter按钮小部件与方法混合在一起,所以每次创建新小部件时都不必创建不同的小部件。这应该包括变量值,但这对我来说很难理解,这就是我来这里寻求帮助的原因。感谢所有帮助; d 这里我张贴的缩短版,原来包含10个按钮,所以你可以想象有多么的差劲,这看起来基本的Python方法和GUI帮助

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

常见的方式做到这一点是确定的默认参数的简短回调包装函数,这反过来与调用实时事件处理函数它需要的论点。下面是基于您的代码示例:

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

声明通过text=i+1参数设置代码。为了给每个标签自己的任意文本值,你可以定义一个包含每个标签的文本另一份清单,例如:

label_text_list = ['L1', 'L2', 'L3', ...] 

,然后在循环中使用

label = tk.Label(text=label_text_list[i], width=6, bg='red') 

代替。

另参见Generate Tkinter buttons dynamically另一个例子。

+0

非常感谢,这清除了一些东西。但是,你能解释tkinter从哪里获取按钮号码值吗?因为当我手动执行操作时,我总是给“按钮”指定不同的名称,但我不明白Python如何实现这个功能 –

+0

我也无法弄清楚在使用自己的不同文本手动创建标签时如何使用此代码值。对不起,我缺乏知识,但我觉得这是我可以学习的唯一方法 –

+0

查看更新后的答案,我试着解决您的问题。 – martineau

0

一个面向对象的方式来做你想做的就是创建一个包含一个或多个GUI小部件的类,并定义对它们进行操作的方法。这被认为是一种更先进的技术,但使用它会稍后更容易地修改和增强您的程序。

例如,您可以将背景颜色设置为变量,而不是将其硬编码为'red',只需向__init__()方法中添加另一个参数并在创建实例时为其传递值。

以下功能与您的脚本(和我的other answer)完全相同。 MyWidget的每个实例中的tk.Button将在创建Button时由于使用command=self.__call__参数而被点击时调用该实例的__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()