Funktion aus Dict ansprechen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Hey
Ich versuche eine Funktion aus einem Dictionary anzusprechen.

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

root = tk.Tk()


def delete():
    for widget_idx, widget in enumerate(root.winfo_children()):
        if widget_idx != 0:
            widget.destroy()


def handler(event):
    delete()
    current = combobox.current()
    value = function_map['keys'][current]
    selections(value)


def selections(value):
    for combo in function_map['buttons'][value]:
        btn = tk.Button(root, text=combo, font=('Arial', 8), width=len(combo)+2)
        btn.pack(side=tk.LEFT, anchor=tk.W)
        btn.bind('<Button-1>', btn_select)


def btn_select(event):
    function_map['functions'][event.widget.cget('text')]()


def kurztext():
    print('self.kurztext(self)')

def langtext():
    print('self.langtext(self)')


function_map = {'keys': ['Datenparameter',
                              'Datenbeziehung'],
                     'buttons': {'Datenparameter': ['Kurztext', 'Langtext', 'Ordnungszahl',
                                                    'Menge', 'Einheit', 'Einheitspreis',
                                                    'Gesamtpreis', 'Intervall', 'Leistung'],
                                 'Datenbeziehung': ['1. Stufe', '2. Stufe', '3. Stufe', '4. Stufe', '5. Stufe',
                                                    'Position', 'Unterposition', 'Zelle', 'Zeile', 'Spalte',
                                                    'Schrift', 'Hintergrund', 'Formel']
                                 },

                     # Hier die Funktionen, die angesprochen werden sollen (erstmal nur zwei :))
                     'functions': {'Kurztext': kurztext, 'Langtext': langtext}

                     }


combobox = ttk.Combobox(root, values=function_map['keys'])
combobox.bind('<<ComboboxSelected>>', handler)
combobox.pack(side=tk.LEFT, anchor=tk.W)
combobox.set('Datenparameter')
selections(combobox.get())

root.mainloop()

Zwar funktioniert der Code, aber in PyCharm wird die Zeile

Code: Alles auswählen

function_map['functions'][event.widget.cget('text')]()
farblich hinterlegt: "Expession is not callable"
Wie macht man es richtig???
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

PyCharm ist halt dumm, heißt, es kann nicht wissen, was Du denn da in ein Dictionary legst.
Das ganze Konstrukt sieht übrigens komisch aus. Was soll denn diese function_map? Das enthält verschiedene Daten, die eigentilch nicht zusammen gehören.
'keys' ist überflüssig, weil das ja schon die Keys von 'buttons' sind. 'buttons' und 'functions' sollten eigentlich zwei unabhängige Konstanten sein. KONSTANTEN schreibt man GROSS.
Du solltest Dir die Buttons in einer eigenen Datenstruktur merken, statt einfach (fast) alles per `destroy` wieder zu löschen. Statt einzelne Buttons zu löschen, packe sie alle in einen Frame und lösche den.
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Dann werd ich das mit zwei unterschiedlichen Dicts machen?
Ist das bei den paar buttons nicht egal, ob ich die oder ein frame lösche?
Antworten