1

トップレベルの編集: この質問は原則として元のスレッドで回答されていますが、もっと知りたい基本的な質問がいくつかあります。質問に直接答えて内臓を壊さないでください。この 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 の異なるボタン クリック関数を記述できることを意味しますが、それは直感に反するように思えます...特に、クラス関数についてほとんど理解していない場合、まさにこの種の課題に対処する必要があります!

どんな提案もありがたく受け取った。

4

1 に答える 1

1

最終的に、init値をself.dictにスローし、クリック関数からdictを変更しました。

したがって、initは次のようになります。

    self.colourDict = \
    {"AVal":"#FFFFFF",
     "BVal":"#FFFFFF",
     "CVal":"#FFFFFF",
     "DVal":"#FFFFFF",
      etc. 

テキストボックスメーカーは次のとおりです。

    self.boxA = Text(self.mainframe, state='normal', width=3, height=1, background=self.colourDict['AVal'])
    self.boxB = Text(self.mainframe, state='normal', width=3, height=1, background=self.colourDict['BVal'])
    self.boxC = Text(self.mainframe, state='normal', width=3, height=1, background=self.colourDict['CVal'])
    etc.

次にグリッド化されます:

    self.boxA.grid(column=2, row=2, padx=4)
    self.boxB.grid(column=3, row=2, padx=4)
    self.boxC.grid(column=4, row=2, padx=4)
    etc.

次にボタン:

    self.bloba = ttk.Button(self.mainframe, text="A",style= 'mainSmall.TButton', command= lambda: self.getColour(self.boxA,"AVal")).grid(column=2, row=3)
    self.blobb = ttk.Button(self.mainframe, text="B",style= 'mainSmall.TButton', command= lambda: self.getColour(self.boxB,"BVal")).grid(column=3, row=3)
    self.blobc = ttk.Button(self.mainframe, text="C",style= 'mainSmall.TButton', command= lambda: self.getColour(self.boxC,"CVal")).grid(column=4, row=3)
    etc.

ボタン機能のポイント:

def getColour(self,glyphRef, value):
    (triple, hexstr) = askcolor()
    if hexstr:
        glyphRef.config(bg=hexstr)
        self.colourDict[value] = hexstr

これは、視覚的な色を設定し、後で分析するために結果をXMLに保存するために使用できる呼び出し可能なdictを提供します。仕事は終わりました。:)

于 2013-01-14T07:44:37.710 に答える