@BerndBen: Du schreibst Du willst die Eingaben in einer Methode verarbeiten, aber Du hast da keine Methode sondern eine Funktion. Für nicht-triviale GUIs braucht man aber tatsächlich objektorientierte Programmierung (OOP), also tatsächlich Methoden.
Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.
Auf Modulebene sollte nur Code stehen 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.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).
Namen sollten keine kryptischen Abkürzungen enthalten und mehrere Worte in einem Namen in der richtigen Reihenfolge geschrieben werden.
Funktions- und Methodennamen beschreiben in der Regel die Tätigkeit, welche die Funktion/Methode durchführt, damit der Leser weiss was da passiert und um Funktionen/Methoden leichter von eher passiven Werten unterscheiden zu können.
Kommentare sollten passend zum Quelltext eingerückt werden, weil sie sonst den Vorteil das man an der Einrückung die Programmstruktur ablesen kann, kaputt machen.
Der Code sollte nicht nach den Widget-Typen sortiert sein die da erzeugt werden, sondern der Anzeigereihenfolge entsprechen, damit man sich die GUI leichter vorstellen kann, und auch leichter Codeteile in andere Funktionen/Methoden auslagern kann.
Das `tkinter`-Modul hat Konstanten für Zeichenketten die bei bestimmten Argumenten feste Werte annehmen kann, wie beispielsweise bei `anchor`. Die sollten man literalen Zeichenketten vorziehen.
Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk
from functools import partial
def save_new_pi(anzahl_entry):
pi_anzahl = int(anzahl_entry.get())
print(pi_anzahl)
def create_pi_input_view(master):
tk.Label(master, text="LP-Artikelnummer:").place(
relx=0.125, rely=0.055, anchor=tk.NW
)
artikelnummer_entry = tk.Entry(master)
artikelnummer_entry.place(x=240, y=35, width=100, height=20)
tk.Label(master, text="Anzahl:").place(relx=0.225, rely=0.10, anchor=tk.NW)
anzahl_entry = tk.Entry(master)
anzahl_entry.place(x=240, y=60, width=100, height=20)
tk.Button(
master, text="Speichern", command=partial(save_new_pi, anzahl_entry)
).place(relx=0.3, rely=0.40, anchor=tk.NW)
def main():
root = tk.Tk()
root.title("Leiterplatten Bestellungen")
root.geometry("800x600")
main_menu = tk.Menu(
root,
background="#FF8000",
foreground="black",
activebackground="white",
activeforeground="black",
)
file_menu = tk.Menu(main_menu, tearoff=False, foreground="black")
file_menu.add_command(
label="Neue PI eingeben", command=partial(create_pi_input_view, root)
)
file_menu.add_separator()
file_menu.add_command(label='Beenden', command=root.quit)
main_menu.add_cascade(label="Datei", menu=file_menu)
auswertungen_menu = tk.Menu(main_menu, tearoff=False)
auswertungen_menu.add_command(label="Selektiert nach Artikel")
main_menu.add_cascade(label="Auswertungen", menu=auswertungen_menu)
root.config(menu=main_menu)
root.mainloop()
if __name__ == "__main__":
main()
Das Programm hat aber Probleme. Jedes mal wenn man den "Neue PI eingaben"-Menüpunkt aufruft, werden immer wieder neue Eingabeelemente erstellt. Man erstellt deshalb GUIs einmal am Anfang komplett. Falls in dem Fenster mehrere Inhalte darstellen soll, zwischen denen gewechselt werden soll, dann macht man genau das: man erstellt mehrere Frames, die alle übereinander in einer `grid()`-Zelle liegen, und holt dann immer den Inhalt nach vorne, den man gerade anzeigen möchte.
Man verwendet kein `place()`. Auch relative Angaben helfen nicht kaputte GUIs zu verhindern. Bei mir wird beispielsweise das erste Label nicht komplett dargestellt; das verschwindet hinter dem Eingabefeld: