2017-07-10 123 views
0

當您按下面的其中一個按鈕時,我想更新孩子的名字。有了這個lambda函數,無論按下哪個按鈕,我都會得到姓。是否有可能使用lambda函數修復它?據我所見,lambda函數與定義值一起工作良好,但我還沒有看到任何變量的例子。我該如何解決它?謝謝,單擊按鈕時更新tkinter畫布

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
#------------------------------------------------------------ 

__title__= 'Control' 
__date__ = '10/07/2017' 
__version__ = '0.0.1' 

from tkinter import * 
from tkinter import ttk 

class Panel(): 
    def __init__(self, database, name): 

     self.root = Tk() 
     self.root. title('Control V' + __version__) 
     self.root.configure(bg='beige') 

     self.window = ttk.Frame(self.root, borderwidth=2, relief="raised", 
           padding=(10,10)) 
     self.window.grid(column=0, row=0) 
     self.window.option_add("*Font", "Helvetica 12") 

     # Row 0 
     self.header = ttk.Label(self.window, text=name, padding=(1,1), 
           anchor='center') 
     self.header.grid(row=0, column=0, columnspan=3) 

     # Row 1 

     for col, record in enumerate(database, 0): 
      name = database[col]['Letter'] 
       label = ttk.Button(self.window, text=name, 
         command=lambda *args: self.get_name(col, database)) 
       label.grid(row=1, column=(col), sticky='ew') 

     # All set 
     self.root.mainloop()   


    def get_name(self, row, database): 
     name = database[row]['Name'] 
     self.header.configure(text=name) 

def main(): 

    database = [ 
     {'Letter': 'A', 'Name': 'Zara'}, 
     {'Letter': 'B', 'Name': 'Ezra'}, 
     {'Letter': 'C', 'Name': 'Amy'}, 
    ] 
    name = database[0]['Name'] 
    my_panel = Panel(database, name) 
    return 0 

if __name__ == '__main__': 
    main() 

回答

0

如果更改GET_NAME的咖喱功能:

def get_name(row, database): 
    name = database[row]['Name'] 
    def _get_name(): 
     self.header.configure(text=name) 
    return _get_name 

,並用此取代命令聲明返回功能:

label = ttk.Button(self.window, text=name, 
        command=self.get_name(col, database)) 

如預期的結果。 (這是什麼定義了當你創建按鈕時按鈕點擊的返回值,而不是稍後嘗試傳遞參數。你原來的代碼有所有的按鈕都依賴'col'(變量)。這仍然是它被設置爲(2-> Amy)的最後一件事,這就解釋了爲什麼你總是得到這個結果。)

+0

Kadnarim,謝謝。我從未使用咖喱功能。正如你告訴我的,它工作得很好。我只需要在你的get_name定義中添加自己。謝謝! – ogeretal