2013-01-14 41 views
1

頂級編輯:這個問題原則上已在原始線程中得到解答 - 但是,有一些基本問題我想了解更多。請不要直接回答這個問題。如果它雜亂無章,我很樂意去除這個問題!Python/tKinter/ttk - 在按鈕單擊時傳遞一個對象


與此相關的問題,我昨天問:Python/ttk/tKinter - passing an argument with a button click func?

我嘗試一種新的方法,我可以(在某種程度上)得到它的工作,但是,只有當我「硬」的代碼功能,我試圖避免...

我有36個按鈕[az] & [0-9]。當用戶點擊按鈕時,彈出對話框,我想要記錄返回的顏色。

在課堂上的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. 

當我填充一個文本框,我用的顏色VAR爲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) 

注 - 我「送」的字符串的變種,因爲我可以不要讓對象正確地傳遞 - 理想情況下,我只想發送對象,但這是我可以開始工作的唯一工作。

然後我設置的FUNC鍵:

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種不同的按鈕點擊功能,但這似乎與我們的直覺毫無關係......尤其是當我對課堂功能的理解很少時,它恰好可以處理這種挑戰!

任何建議感激地收到。

+0

不是答案,但你應該做'print self.bloba'。我敢打賭,你會發現這不是你所期望的。 'object.grid()'不返回值。 'print self.boxA'也是一樣的。 –

+0

謝謝 - 我最終將init值拋入'self.dict',然後從click func中更改字典。它與我錯過的昨天提供的解決方案結合起來!好的故障排除技巧雖然,謝謝! –

回答

1

我結束了將init值扔到self.dict中,然後從click func中改變字典。

所以現在在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. 

這在FUNC鍵指向:

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

這兩組的視覺色彩,並給了我一個可調用的字典,我可以用它來保存結果以XML爲以後的分析。任務完成。 :)

相關問題