2013-10-31 55 views
0

法在下面的代碼,構建按鈕的兩種方式的行爲不同:爲什麼這些按鈕的構造不同的方式

from Tkinter import * 
def buildButton1(): 
    root = Tk() 
    Button(root, command = lambda : foo(1)).pack() 
    Button(root, command = lambda : foo(2)).pack() 

def buildButton2(): 
    root = Tk() 
    buttons = (Button(root, command = lambda : foo(i)) for i in range(2)) 
    map(lambda button : button.pack(), buttons) 

def foo(number): 
    print number 

兩種方法都Tkinter的窗口有兩個表面上相同的按鈕佈局,但在第二個例子 - 這似乎更簡潔的是我們添加了50個按鈕而不是2個 - 傳入foo的值是最後一次迭代的i。

因此,在這種情況下,按任何使用buildButton2製作的按鈕都將打印1,其中buildButton1的按鈕將分別打印0和1。爲什麼有差異?有沒有辦法讓buildButton2按預期工作?

編輯 它已經指出,這是一個重複的問題,而這個建設一個更正確的方法是這樣寫:

buttons = (Button(root, command = lambda i=i : foo(i)) for i in range(2)) 

這給期望的結果。多謝你們!

+0

除非我錯了,你需要'按鈕=(按鈕(根,命令=拉姆達我:在範圍FOO(I)),其中i(2)) ',這樣''我'的值被傳遞給lambda。 –

+0

不要以爲是對的,Burhan;事實上,它似乎拋出一個異常,因爲按鈕不傳遞任何參數傳遞任何參數到函數 –

回答

0

你的應用程序應該只有1個TK根目錄。這只是您應用程序中的一個示例或實際代碼?如果它是真正的代碼,那麼每次「生成」按鈕時都會嘗試獲取TK根目錄。您應該將root = TK()移到您的主代碼中,因爲您的應用程序只有一個根。每個窗口,按鈕......都是這個根的孩子。

你可以嘗試這樣的事:

from tkinter import * 
from tkinter import ttk 

    class testWnd(ttk.Frame): 

     def createWndMain(self): 
      self.BtnLoad = ttk.Button(self, text="Load file", command=self.LoadMyFile) 
      self.BtnLoad.grid(column=10, row=10, padx=8, pady=4, sticky=(S, E, W)) 

      self.BtnQuit = ttk.Button(self, text="Quit", command=self.quit) 
      self.BtnQuit.grid(column=10, row=20, padx=8, pady=4, sticky=(S, E, W)) 

      self.Spacer = ttk.Frame(self, height = 12) 
      self.Spacer.grid(column = 10, row = 15, sticky = (S, E, W)) 

      self.columnconfigure(5, weight = 1) 
      self.rowconfigure(5, weight = 1) 

     def LoadMyFile(self): 
      pass 

     def __init__(self, tkRoot): 
      ttk.Frame.__init__(self, tkRoot) 
      tkRoot.title("My Application v 1.0") 
      tkRoot.columnconfigure(0, weight = 1) 
      tkRoot.rowconfigure(0, weight = 1) 
      self.tkRoot = tkRoot 
      self.grid(column = 0, row = 0, sticky = (N, S, E, W)) 
      self.createWndMain() 

    tkRoot = Tk() 
    myWndMain = testWnd(tkRoot) 
    myWndMain.mainloop() 
+0

它只是示例代碼,我很擅長製作根窗口:)我更關心的行爲按鈕傳遞的參數 –

相關問題