顶级编辑:这个问题原则上已在原始线程中得到回答 - 但是,有一些基本问题我想了解更多。请不要直截了当地回答这个问题。如果它杂乱无章,我很高兴删除这个 Q!
与我昨天问的这个问题相关:Python/ttk/tKinter - 通过按钮单击函数传递参数?
我正在尝试一种新方法,并且我可以(在某种程度上)让它工作,但是,只有当我对函数进行“硬”编码时,我才试图避免......
我有 36 个按钮 [az] 和 [0-9]。当用户单击按钮时,会askcolor
弹出对话框,我希望记录返回的颜色。
在类 init 中,我声明了一些变量(都将颜色值设置为白色):
class MakeGUI(Frame):
def __init__(self,root):
Frame.__init__(self, root)
self.root = root
##colour values
self.AVal = "#FFFFFF"
self.BVal = "#FFFFFF"
self.CVal = "#FFFFFF"
etc.
当我填充文本框时,我使用颜色变量作为 bg arg:
## letter labels
self.boxA = Text(self.mainframe, state='normal', width=3, height=1, background=self.AVal).grid(column=2, row=2, padx=4)
self.boxB = Text(self.mainframe, state='normal', width=3, height=1, background=self.BVal).grid(column=3, row=2, padx=4)
self.boxC = Text(self.mainframe, state='normal', width=3, height=1, background=self.CVal).grid(column=4, row=2, padx=4)
etc.
然后我设置了按钮:
self.bloba = ttk.Button(self.mainframe, text="A",style= 'mainSmall.TButton', command= lambda: self.getColour("self.AVal")).grid(column=2, row=3)
self.blobb = ttk.Button(self.mainframe, text="B",style= 'mainSmall.TButton', command= lambda: self.getColour("self.BVal")).grid(column=3, row=3)
self.blobc = ttk.Button(self.mainframe, text="C",style= 'mainSmall.TButton', command= lambda: self.getColour(("self.CVal")).grid(column=4, row=3)
注意 - 我正在“发送” var 的字符串,因为我无法让对象正确传递 - 理想情况下我只想发送对象,但这是我可以开始工作的唯一解决方法。
然后我设置了按钮功能:
def getColour(self,glyphRef):
print self.AVal
(triple, hexstr) = askcolor()
if hexstr:
eval(glyphRef+"=hexstr")
print self.AVal
这两个打印语句仅用于监视目的,因为我弄清楚如何让它工作。
我也很清楚这种eval
方法是不可取的或不理想的。我只是找不到让我接近理想解决方案的替代方法....
此方法会引发错误:
#FFFFFF
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
return self.func(*args)
File "colourPicker/colourTest.py", line 109, in <lambda>
self.bloba = ttk.Button(self.mainframe, text="A",style= 'mainSmall.TButton', command= lambda: self.getColour("self.AVal")).grid(column=2, row=3)
File "colourPicker/colourTest.py", line 161, in getColour
eval(glyphRef+"=hexstr")
File "<string>", line 1
self.AVal=hexstr
^
SyntaxError: invalid syntax
为了尝试测试发生了什么,我尝试在按钮 func 中对 var 进行硬编码:
def getColour(self,glyphRef):
print self.AVal
(triple, hexstr) = askcolor()
if hexstr:
self.AVal=hexstr
print self.AVal
这确实会导致 var 被更改:
#FFFFFF
#24d9d9
这意味着我可以编写 36 种不同的按钮点击函数,但这似乎违反直觉……尤其是当我对类函数了解甚少时,它就是要应对这种挑战!
任何建议都非常感激。