【问题标题】:Basic methods & GUI assistance基本方法和 GUI 帮助
【发布时间】:2015-06-30 15:04:30
【问题描述】:

如果涉及到 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()

【问题讨论】:

    标签: python user-interface methods tkinter


    【解决方案1】:

    执行此操作的常用方法是定义一个带有默认参数的简短回调包装函数,该函数反过来使用它需要的参数调用真实的事件处理函数。这是基于您的代码的示例:

    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 以获取另一个示例。

    【讨论】:

    • 非常感谢,这让事情变得更清楚了。但是您能解释一下 tkinter 从哪里获取按钮编号值吗?因为当我“手动”执行此操作时,我总是为“按钮”分配不同的名称,而我不知道 Python 是如何做到这一点的
    • 我也无法弄清楚在使用自己的不同文本值手动创建标签时如何使用此代码。对不起,我缺乏知识,但我觉得这是我学习它的唯一方法
    • 查看我已尝试解决您的问题的更新答案。
    【解决方案2】:

    我建议为你的按钮创建一个类,有很多关于类的教程,这里有一个对我很有帮助:

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

    【讨论】:

      【解决方案3】:

      一种面向对象的方法是创建一个包含一个或多个 GUI 小部件并定义对其进行操作的方法的类。这被认为是一种更高级的技术,但使用它会使以后修改和增强您的程序更容易。

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

      以下内容与您的脚本(以及我的other answer)执行相同的操作。由于在创建Button 时使用了command=self.__call__ 参数,MyWidget 的每个实例中的tk.Button 将在单击该实例时调用该实例的__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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多