@roomwithaview: ``from functools import partial as fupa``? Ernsthaft?
Dann sind `tkFrame`, `tkLabel`, und `tkButton` undefiniert. `tkinter.Tk` explizit als `tk` zu importieren ist auch eine ziemlich schlechte Idee.
Der Code im ``if __name__ ...``-Zweig gehört in eine Funktion. Denn der definiert globale Variablen und eine davon wird dann auch prompt versucht in der Klasse zu verwenden.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Mal davon abgesehen: Warum ist das ”g” in `ausGabe` gross geschrieben? Warum das ”g” in `MaingUI` klein? Warum ”y” und ”a” in `My_aPP` klein? Die Vorsilbe „my“ ist in Namen zudem auch noch unsinnig solange es nicht auch „our“ oder etwas in der Richtung gibt wogegen das „my“ dann eine wirklich relevante Information ist um Dinge auseinander halten zu können.
Kommentare fangen mit *einem* ``#`` an und werden entsprechend dem Code eingerückt zu dem sie gehören. Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist.
`master` ist ein passender Argumentname für das erste Argument einer `__init__()`-Methode wenn das auch tatsächlich eine Widgetklasse ist und `master` das übergeordnete Widget in der Hierarchie ist. Das ist in der vorliegenden Klasse aber nicht der Fall. Die erbt implizit von `Objekt` und das als `master` übergebene Objekt ist in keinerlei Beziehung ein ”Meister” dieser Klasse. Es würde an dieser Stelle vielleicht Sinn machen tatsächlich von `Tk` zu erben. Dann gibt es aber auch keine übergeordnete Widgetklasse, denn `Tk` ist grundsätzlich an der Spitze einer solchen Hierarchie.
Das `master`-Argument ist bei `tkinter`-Widgets die ein übergeordnetes Objekt benötigen *immer* das erste Argument. Es ist also nicht nötig oder sinnvoll da beim ersten Argument eine Übergaben als Schlüsselwortargument zu machen.
`place()` und Grössenangaben in Pixeln macht man nicht. Das funktioniert nicht wirklich. Das geht auf dem System wo man das so entwirft, aber sowie sich Randbedingungen wie Bildschirmauflösung, Schrifteinstellung, und so weiter, ändern, sieht das entweder nicht mehr richtig aus, oder ist sogar unbenutzbar wenn sich Bedienelemente überlappen und/oder Texte nicht mehr oder nicht mehr ganz sichtbar sind.
Wenn das `tkinter`-Modul Konstanten für bestimmte Argumente definiert, sollte man *die* verwenden, statt den Wert als Zeichenkettenliteral selbst noch mal zu schreiben.
Das Attribut `ausgabewert` ist undefiniert. Soll wohl eine Liste sein‽
Namen sollten nicht kryptisch abgekürzt werden und auch nicht nummeriert werden. Warum heisst `b1` nicht einfach `button`? Warum überhaupt ein Name für dieses Objekt, und dann auch noch als Attribut, denn das wird ja anscheinend danach nicht mehr verwendet. Den `Frame` hätte man auch nicht an das Objekt binden müssen.
`zeige_ausgabe()` ist inhaltlich falsch weil die Methode mehr macht als nur eine Ausgabe zu zeigen. Das erweitert die Ausgabe. `i` ist da auch kein besonders guter Argumentname. Und ist das wirklich notwendig, das man dort andere Werte als Zeichenketten übergeben können muss? Denn wenn dort eh alles in Zeichenketten umgewandelt wird, kann man auch gleich nur Zeichenketten übergeben.
Es macht keinen Sinn in dem Label eine leere Zeichenkette zu setzen um gleich in der nächsten Zeile einen anderen Wert für den Text zu setzen.
Das Ergebnis der `str.join()`-Methode ist bereits eine Zeichenkette. Ein zusätzlicher `str()`-Aufruf mit dem Ergebnis macht den Wert nicht irgendwie noch ”zeichenkettiger”.
Zwischenstand:
Code: Alles auswählen
#/usr/bin/env python3
import tkinter as tk
from functools import partial
class MainGUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.resizable(False, False)
self["background"] = "#000000"
self.ausgabe_teile = list()
self.ausgabe_label = tk.Label(
self,
text="0",
width=20,
anchor=tk.E,
font=("Sans Bold", 20),
background="#ffffff",
)
self.ausgabe_label.pack(padx=5, pady=5)
text = "1"
tk.Button(
self,
text=text,
relief=tk.FLAT,
command=partial(self.erweitere_ausgabe, text),
).pack()
def erweitere_ausgabe(self, text):
self.ausgabe_teile.append(text)
self.ausgabe_label["text"] = "".join(self.ausgabe_teile)
def main():
gui = MainGUI()
gui.mainloop()
if __name__ == "__main__":
main()