Python 3:如何在循环中为按钮网格创建命令?

时间:2015-10-03 08:52:35

标签: python-3.x for-loop button tkinter

我刚刚开始学习Python,以帮助我创建一个小UI来管理我的renderfarm上的Windows客户端。这是我的问题的一个例子:

import tkinter as tk

#my variable : number of clients specified by the user
NUMCLIENTS = 10

class APP(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        for i in range (0,NUMCLIENTS):
            i = i+1

            #name buttons, commands and texts
            button = ("b",i,"_01")
            CMD = ("command"+str(i))
            RN = ("RN0"+str(i))

            #create buttons on grid with text
            self.button = tk.Button(self, text= RN, command = self.CMD)
            self.button.grid(row=i, column=0, sticky="s, n, e, w")

    #the command I want to duplicate for each button
    def CMD (self):
        #print the button name
        print (RN)         

app = APP()
app.mainloop()

我需要创建与客户端一样多的行(在变量“NUMCLIENTS”中指定)并为每个行关联一个特定的命令,例如:

button1 pressed => print text "RN01"
button2 pressed => print text "RN02"

......等等。

我不知道如何循环我的命令,就像我循环按钮并关联它们。我看到某处可能存在循环函数的“后期绑定”问题。我尝试使用列表但从未成功。

我希望你能帮助我。

感谢您的帮助和耐心。

2 个答案:

答案 0 :(得分:1)

之前已经回答过类似的问题。在循环中创建variant命令的问题是绑定问题。简而言之,您需要的变化是

def cmd(self, name): print(name)
...
    self.button = tk.Button(self, text= RN,
                            command=lambda name=text: self.cmd(name))

编辑:将修正的工作示例添加到name=部分。

import tkinter as tk
root = tk.Tk()
def cmd(name):
    print('Button ', name)
for i in range(3):
    txt = 'B'+ str(i)
    tk.Button(text=txt, command=lambda name=txt:cmd(name)).pack()
root.mainloop()

答案 1 :(得分:1)

就像它更好:

def cmd(self, name): print(name)
...
    self.button = tk.Button(self, text= RN,
                            command=lambda name=RN: self.cmd(name)

如果我想要更多变量:

def cmd(self, var1, var2):
    print(var1)
    print(var2)
...
    self.button = tk.Button(self, text= RN,
                            command=lambda var1=button, var2=RN : self.cmd(var1, var2))

再次感谢您的帮助。