2012-12-03 28 views
0
from tkinter import * 

class GameBoard(Frame): 
    def __init__(self): 
    top = Toplevel() 
    Frame.__init__(self) 
    self.master.title("test") 
    self.grid() 
    #button frame 
    self.__buttonPane = Frame(self) 
    self.__buttonPane.grid() 
    #buttons 
    self.__buttonA1 = Button(self.__buttonPane,text = "A1",command = self._test("A")) 
    self.__buttonA1.grid() 

def _test(self,test): 
    if self.__buttonA1["state"] == NORMAL: 
     print(test) 


def main(): 
    GameBoard().mainloop() 

main() 

此代碼將無法正常工作因變量,如果刪除變量測試,並使其如何修復我的代碼變量在python類中?

from tkinter import * 

class GameBoard(Frame): 
    def __init__(self): 
    top = Toplevel() 
    Frame.__init__(self) 
    self.master.title("test") 
    self.grid() 
    #button frame 
    self.__buttonPane = Frame(self) 
    self.__buttonPane.grid() 
    #buttons 
    self.__buttonA1 = Button(self.__buttonPane,text = "A1",command = self._test) 
    self.__buttonA1.grid() 

    def _test(self): 
    if self.__buttonA1["state"] == NORMAL: 
     print("hi") 

def main(): 
    GameBoard().mainloop() 

main() 

我將如何修復我的代碼,因此它會允許一個可變的輸入? 這只是我正在做的測試,所以我可以讓它在更大的代碼中工作。

+0

這是沒有意義的,可變的存在,因爲按下一個按鈕是不是你可以指定一個「值」的行動因爲:你只要按下按鈕就可以了。你想從哪裏得到變量值? – BrenBarn

+0

第一個程序段中的代碼如何工作?在刪除變量的第二個塊中會發生什麼?你什麼時候想輸入變量的輸入? – martineau

回答

2

當您指定command = self._test時,self._test是一個將被調用的函數。 self._test("A")不是函數,它是對函數的調用(返回None,因爲定義中沒有return聲明)。

你可以寫「調用self._test("A")因爲無論是lambda: self._test("A"),或functools.partial(self._test, "A"),或明確GameBoard.__init__功能:

def _f(): 
    self._test("A") 
self.__buttonA1 = Button(self.__buttonPane,text = "A1",command = _f) 
+0

lambda爲我工作,你能澄清爲什麼它的工作原理,我試着閱讀函數,我只想知道它實際上在這裏做什麼! –

+0

@ user1867117 lambda是做這件事的一個不好的方法 - 'functools.partial()'是爲了完成這個工作而存在 - 使用它。 –

+1

@ user1867117編寫def _f():self._test(「A」)'就像是在寫'_f = lambda:self._test(「A」)''一樣。他們都將變量'_f'設置爲一個函數。我的例子是'lambda',但不是將lambda分配給一個變量,而是直接使用它。 Lambdas比'functools.partial'稍微慢一些,但是更清晰易讀。如果您每秒運行一次lambda超過幾十次,則可能需要通過調用functools.partial來替換它。 – r3m0t

3

問題是當你做command = self._test("A"),你正在調用函數,並使用返回的值(在這種情況下是None)。

解決方案是使用functools.partial(),它接受一個函數和一些值,然後給你一個新的函數,它只是用你傳遞給它的值(和你在運行時傳遞的其他值)調用給定函數:

command = functools.partial(self._test, "A") 

你也可以手動執行此操作通過使你的函數返回一個函數:

def _test(self, test): 
    def f(self): 
     if self.__buttonA1["state"] == NORMAL: 
      print(test) 
    return f 

請注意,這會損害您的來電_test()在其它地方的能力。

0

當創建按鈕處理程序,它是按鈕本身傳遞給一個好主意處理程序。這樣,一個處理程序可以處理許多按鈕,並且處理程序可以自由檢查按鈕的所有屬性。

這裏有一個簡單的方法來實現,基於代碼:

self.__buttonA1 = Button(self.__buttonPane,text = "A1") 
    self.__buttonA1.grid() 
    self._connect_button(self.__buttonA1, self._test) 
    self.__buttonA2 = Button(self.__buttonPane,text = "A2") 
    self.__buttonA2.grid() 
    self._connect_button(self.__buttonA2, self._test) 

    def _connect_button(self, button, handler): 
    button['command'] = lambda: handler(button) 

    def _test(self, button=None): 
    if button is not None: 
     print("test:text:", button["text"]) 
     print("test:state", button["state"]) 
相關問題