我刚刚开始学习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"
......等等。
我不知道如何循环我的命令,就像我循环按钮并关联它们。我看到某处可能存在循环函数的“后期绑定”问题。我尝试使用列表但从未成功。
我希望你能帮助我。
感谢您的帮助和耐心。
答案 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))
再次感谢您的帮助。