@Mr.101Freaking: Die erste Funktion wird ausgeführt weil *Du* das machst. In Zeile 23 rufst Du die Funktion auf und übergibst deren *Rückgabewert* als `command`-Argument an `Button()`. Die Funktion gibt eine Zeichenkette zurück, die kann Tkinter dann aber nicht aufrufen wenn die Schaltfläche vom Benutzer angeklickt wird. Weil, nun ja weil Zeichenketten nicht aufrufbar sind:
Code: Alles auswählen
In [11]: '100'()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-b395290e35b7> in <module>()
----> 1 '100'()
TypeError: 'str' object is not callable
Was hätte da auch bei herauskommen sollen?
Du musst als `command`-Argument eine *Funktion* übergeben die kein Argument erwartet, den Tkinter ruft die ohne Argument auf. Wenn dadurch eine mit Argument aufgerufen werden soll, kann man sich mit `functools.partial()` aus einer Funktion und einem Wert so eine Funktion erstellen. Oder man verwendet einen ``lambda``-Ausdruck.
Zum zweiten Problem: Da wird nichts zurückgesetzt. `gv` auf Modulebene hat während des ganzen Programmablaufs (nach dem der Name definiert wurde) den gleichen Wert. Der wird nirgends geändert. Insbesondere Zeile 13 ändert das `gv` auf Modulebene nicht sondern definiert einen lokalen Namen `gv` innerhalb der Funktion. Such gar nicht erst nach einem Weg das `gv` auf Modulebene neu zu binden, denn das hat dort nichts zu suchen. Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Womit wir beim Lösungsansatz wären: objektorientierte Programmierung. Da kommt man bei GUI-Programmierung nicht drum herum wenn das eine saubere Lösung werden soll.