2017-07-10 6 views
0

Ich möchte den Namen des untergeordneten Elements aktualisieren, wenn Sie eine der folgenden Tasten drücken. Mit dieser Lambda-Funktion erhalte ich immer den Nachnamen, egal welche Taste gedrückt wird. Ist es möglich, es mit Lambda-Funktionen zu beheben? Soweit ich gesehen habe funktionieren Lambda-Funktionen gut mit definierten Werten, aber ich habe keine Beispiele mit Variablen gesehen. Wie kann ich es reparieren? Danke,tkinter Canvas aktualisieren, wenn auf die Schaltfläche geklickt wird

#!/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() 

Antwort

0

Wenn Sie get_name auf eine curried Funktion ändern:

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

und ersetzen damit den Befehl Erklärung zurück Funktion:

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

das Ergebnis wie erwartet.

(Dies bedeutet, den Rückgabewert der Schaltfläche klicken Sie beim Erstellen der Schaltfläche, anstatt zu versuchen, einen Parameter später übergeben. Ihr ursprünglichen Code hatte alle Schaltflächen hängen von 'col' (die Variable). Dies bleibt die letzte Sache, auf die es eingestellt wurde (2-> Amy), was erklärt, warum Sie immer das Ergebnis erhalten haben.)

+0

Kadnarim, danke. Ich habe noch nie Curry-Funktionen benutzt. Es hat gut funktioniert, wie du mir gesagt hast. Ich musste nur selbst in Ihre get_name Definition hinzufügen. Danke! – ogeretal

Verwandte Themen