@Bulli03: Es sieht so aus als solltest Du erst einmal die Grundlagen lernen, inklusive objektorientierter Programmierung (OOP), also eigene Klassen schreiben. Denn das braucht man für jede nicht-triviale GUI.
Die Klasse die Du da hast macht keinen Sinn. Du willst keinen eigenen `Button` ableiten, denn an dessen Eigenschaften musst Du ja gar nichts ändern. Tust Du ja auch nicht wirklich, denn die eine vorhandene Methode funktioniert so überhaupt gar nicht. `ei1` gibt es nicht. Und wenn Du `einfügen1` eine ganze Zahl zuweist, dann hat die ganz sicher keine `delete()`-Methode.
Sonstige Anmerkungen: Sternchen-Importe sind Böse™. Damit holt man sich gerade bei `tkinter` über 100 Namen ins Modul von denen nur ein kleiner Bruchteil wirklich gebraucht wird. Und nicht nur welche die im `tkinter`-Modul definiert werden, sondern aucn alles was das `tkinter`-Modul selber von woanders importiert hat.
Auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Funktionen und Methoden sollten alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen. `MyButton.Kopfrechner()` dürfte also weder `ei1` noch `einfügen1` einfach so verwenden.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). `Kopfrechner` wäre also von der Schreibweise ein Name für eine Klasse, keiner für eine Methode.
Funktionen und Methoden werden üblicherweise nach der Tätigkeit benannt die sie durchführen, damit der Leser weiss was die tun. `Kopfrechner` ist aber keine Tätigkeit. Bei Rückruffunktionen gibt es auch die Konvention das man sie `on_event_name()` nennen kann.
`My` ist so gut wie *nie* ein sinnvoller Präfix, weil der nichts aussagt. Wenn man einen spezialisierteren `Button` programmiert sollte dessen Klassenname dem Leser vermitteln was ihn inhaltlich vom normalen `Button` unterscheidet.
`einfügen` wäre dagegen ein Name hinter dem man als Leser eine Funktion/Methode erwarten würde und kein Eingabefeld.
Man nummeriert keine Namen durch. Dann will man sich entweder bessere Namen ausdenken, oder gar keine Einzelnamen sondern eine Datenstruktur verwenden. Oft eine Liste.
Einzig die beiden Operanden könnte man mit einer Nummer versehen, in solchen Fällen verwende ich dann aber lieber `_a` und `_b` als Suffix, oder schreibe es aus: `first_operand`, `second_operand`.
So einige Namen in dem Programm braucht man auch gar nicht wirklich, weil der Wert danach nie wieder benötigt wird.
Man verwendet kein `place()`. Das funktioniert nicht systemübergreifend weil es viele verschiedene Bildschirmgrössen, -auflösungen, und -einstellungen gibt. Bei mir stösst die „Weiter“-Schaltfläche beispielsweise fast an den rechten Fensterrahmen.
Das "+" ist nicht in der Mitte zwischen den beiden Zahlen, weder horizontal noch vertikal, und der „Vorherige Lösung“-Text ist viel zu dicht an der Zeile darüber: Die Zahl überlappt den Rahmen vom Eingabefeld:
Du verwendest an einigen Stellen literale Zeichenketten für die `tkinter` Konstanten definiert hat. Das vermindert das Risiko das man sich vertippt, und der Leser weiss, dass es da anscheinend feste Werte gibt und nicht jede beliebige Zeichenkette Sinn macht.
Der vorhandene Code überarbeitet:
Code: Alles auswählen
#!/usr/bin/env python3
from random import randint
import tkinter as tk
def main():
first_operand = randint(1, 100)
second_operand = randint(1, 100)
fenster = tk.Tk()
fenster.title("Python-Kopfrechentrainer")
main_frame = tk.Frame(fenster, relief=tk.RIDGE, borderwidth=5)
main_frame.pack(expand=True, fill=tk.BOTH)
frame = tk.Frame(main_frame)
tk.Label(frame, text="Zahl 1:").grid(row=0, column=0)
tk.Label(frame, text="Zahl 2:").grid(row=0, column=2)
first_operand_label = tk.Label(frame, text=first_operand)
first_operand_label.grid(row=1, column=0)
tk.Label(frame, text="+").grid(row=1, column=1)
second_operand_label = tk.Label(frame, text=second_operand)
second_operand_label.grid(row=1, column=2)
frame.pack()
frame = tk.Frame(main_frame)
tk.Label(frame, text="Ergebnis:").pack(side=tk.LEFT)
result_entry = tk.Entry(frame, bd=2, width=10)
result_entry.pack(side=tk.LEFT)
frame.pack()
frame = tk.Frame(main_frame)
tk.Label(frame, text="Vorherige Lösung: ").pack(side=tk.LEFT)
output_label = tk.Label(frame, text=first_operand + second_operand)
output_label.pack(side=tk.LEFT)
frame.pack()
frame = tk.Frame(main_frame)
tk.Button(frame, text="Exit", command=fenster.destroy).pack(side=tk.LEFT)
tk.Button(frame, text="Weiter").pack(side=tk.RIGHT)
frame.pack(expand=True, fill=tk.X)
fenster.mainloop()
if __name__ == "__main__":
main()