[Anfänger]Module mit Tkinter

Fragen zu Tkinter.
Antworten
Kael
User
Beiträge: 33
Registriert: Freitag 2. September 2016, 01:20

Hallo!
Ich wollte hier mal was fragen, auch weil ich nicht genau weiß 'wonach' ich suchen soll.

Und zwar geht es sich um folgenden Fall:
Ich habe 2 Python-Dateien erstellt wo eine Datei die Haupt-GUI sein soll und die andere Dateien sollen Bereiche des GUI's sein. Ich dachte mir das wäre sehr nützlich bezüglich der Übersicht um mit dem Datei zu arbeiten.

Die beiden Dateien sehen so aus:

Datei 1:

Code: Alles auswählen

#Module importieren

import tkinter as tk
import sys
import os

#Kontrollbutton 
def control():
    print("Funktioniert")
#Buttonfunktion
def button_neu():
    import GUI_new_category
    del sys.modules["GUI_new_category"]

#GUI

main_window = tk.Tk() #Erstellung des Fensters
main_window.title("Lagersystem") # Arbeitstitel  <<Muss geändert werden>>
main_window.geometry("200x100")

#Menüleiste
menu_bar = tk.Menu(main_window)

#Filemenu
file_menu = tk.Menu(menu_bar, tearoff = 0)
file_menu.add_command(label="Neu", command=button_neu) #unbenutzt
file_menu.add_command(label="Öffnen", command=control) #unbenutzt
file_menu.add_separator()
file_menu.add_command(label="Exit", command = main_window.destroy)
#Menü Leistenbutton
menu_bar.add_cascade(label="Datei", menu = file_menu)

main_window.config(menu=menu_bar)
main_window.mainloop()

Datei 2:

Code: Alles auswählen

#Modul
import tkinter as tk

def control():
    print("test")

#Neu

class new_category():
    new_window = tk.Toplevel()
    new_window.title("Neues Lager")
    new_window.geometry("200x400")
    
Mein Problem ist folgendes:
Wenn ich das Modul mit Class new_category() importiere, wird dieses modul sofort ausgeführt - bedeutet ich starte das Hauptprogramm und automatisch wird das Modul mit der Klasse ausgeführt. Das soll es allerdings nicht - Es soll erst geöffnet werden wenn man den entsprechenden Button drückt und soll auch dann wiederholbar ausgeführt werden können. Das klappt allerdings nicht so.

Folgendes habe ich schon probiert:
Hat nicht so funktioniert wie ich es dachte:
-Import versucht im Button-Befehl mit einzubinden. Funktioniert auch, allerdings funktioniert es nur 1x.
-Import Befehl in eine Definition gesetzt, selbiges Problem: Es passiert nur einmal.


Hat funktioniert wie ich es dachte:
-Die Klasse im Hauptprogramm schreiben und dann aufrufen.
-Das Modul in einer Funktion aufrufen und danach wieder löschen.

Jetzt bin ich zu folgender 'Lösung' gekommen:

Code: Alles auswählen

def button_neu():
    import GUI_new_category
    del sys.modules["GUI_new_category"]
Allerdings habe ich irgendwie das Gefühl das diese Lösung 1. nicht optimal ist und 2. wenn ich sie bei anderen Dingen wiederhole zu Fehlern führen könnte. Desweiteren könnte es ggf zu Fehlern kommen wenn eine Eingabe gemacht wird(noch nicht ausprobiert)

Hätte da jemand einen Hinweis wie man es besser lösen könnte? Ich muss gestehen mir fällt nämlich nichts ein wie ich es anders lösen könnte. Habe ich irgendwo etwas vergessen?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast ja auch keine wirkliche Klasse geschrieben. Der Code in der Klasse muss in einer Methode stehen, die dann nach Instanziierung ausgeführt wird. Oder einfach die class wegwerfen & den Code in eine Funktion schreiben.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kael: auch wenn es hart klingt, lerne erst einmal wie Klassen funktionieren. Komplexere GUI-Programme zu schreiben, ohne objektorientierte Programmierung zu verwenden, ist nicht sinnvoll. Bevor Du anfängst, etwas in mehrere Module aufzuteilen, fange mit einer Datei an und schreibe mehrere Funktionen und Klassen.

Code: Alles auswählen

import Tkinter as tk
import sys
import os

class NewCategory(tk.Toplevel):
    def __init__(self, master):
        tk.Toplevel.__init__(self, master)
        self.title("Neues Lager")
        self.geometry("200x400")
    
class MainWindow(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Lagersystem") # Arbeitstitel  <<Muss geändert werden>>
        self.geometry("200x100")
        #Menüleiste
        menu_bar = tk.Menu(self)
        
        #Filemenu
        file_menu = tk.Menu(menu_bar, tearoff = 0)
        file_menu.add_command(label="Neu", command=self.button_neu)
        file_menu.add_command(label="Öffnen", command=self.control)
        file_menu.add_separator()
        file_menu.add_command(label="Exit", command = self.destroy)
        #Menü Leistenbutton
        menu_bar.add_cascade(label="Datei", menu = file_menu)
        self.config(menu=menu_bar)
    
    def control(self):
        print("Funktioniert")
        
    def button_neu(self):
        self.new_category = NewCategory(self)

def main():
    main_window = MainWindow()
    main_window.mainloop()

if __name__ == '__main__':
    main()
Antworten