トップレベルの編集: この質問は原則として元のスレッドで回答されていますが、もっと知りたい基本的な質問がいくつかあります。質問に直接答えて内臓を壊さないでください。この Q がごちゃごちゃしている場合は、喜んで削除します。
私が昨日尋ねたこの質問に関連して: Python/ttk/tKinter - 引数をボタン クリック機能で渡しますか?
私は新しいアプローチを試みていますが、それを機能させることができますが、回避しようとしている関数を「ハード」コーディングした場合にのみ...
[az] と [0-9] の 36 個のボタンがあります。ユーザーがボタンをクリックすると、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 引数として使用します。
## 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
2 つの print ステートメントは、監視目的でのみ存在し、それを機能させる方法を理解しています。
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
何が起こっているのかをテストするために、ボタン関数で var をハードコーディングしてみました。
def getColour(self,glyphRef):
print self.AVal
(triple, hexstr) = askcolor()
if hexstr:
self.AVal=hexstr
print self.AVal
これにより、変数が変更されます。
#FFFFFF
#24d9d9
これは、36 の異なるボタン クリック関数を記述できることを意味しますが、それは直感に反するように思えます...特に、クラス関数についてほとんど理解していない場合、まさにこの種の課題に対処する必要があります!
どんな提案もありがたく受け取った。