Seite 1 von 1

Funktion aus Dict ansprechen

Verfasst: Montag 2. März 2020, 14:42
von DMD-OS
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???

Re: Funktion aus Dict ansprechen

Verfasst: Montag 2. März 2020, 14:56
von Sirius3
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.

Re: Funktion aus Dict ansprechen

Verfasst: Montag 2. März 2020, 15:37
von DMD-OS
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?