Hallo Fritz,
bevor Du dich verrennst, noch ein paar Anmerkungen.
Pycharm ist ein mächtiges Werkzeug und es gibt dir bestimmt viele Warnmeldungen zurück. Auch wenn dein Script in Pycharm funktioniert, solltest Du die Warnungen beachten und reagieren. Auch ein Test mit einem direkten Programmaufruf, oder im Interpreter, schadet nicht, dann siehst Du ob's funktioniert. Im Interpreter bekommst Du auch Fehlermeldungen.
Wenn Du dein kleines Projekt weiter entwickeln willst, solltest Du dich in objektorientierte Programmierung,
also Klassen, einarbeiten.
Du siehst, wie viele Argumente den Funktionen übergeben werden. Vergleich das mal mit dem Beispiel mit der Klasse. Nur mit Funktionen wird das bald einmal unübersichtlich.
Nun zu deinen Vorgaben: Du willst den Focus immer wieder im Einstellungsfenster haben. Das kannst Du, so wie hier gezeigt, mit der Option transient handhaben, oder Du versteckst das root- (und eventuell andere) Fenster mit iconify, oder withdraw, dann darfst Du aber "transient(root)" nicht verwenden.
Ich finde das iconifizieren besser, denn der Anwender weiss in der Regel was er tut und soll die Kontrolle behalten. Mit grab konnte ich mich bisher nicht anfreunden, es klammert mir zu fest und ich sehe den Sinn noch nicht. Probier mal grab_set_global
.
Weiter willst Du, dass es nur eine Instanz des Einstellungsfensters gibt. Das erreichst Du, indem Du die Untermenütaste Einstellungen nach dem Erstellen des Fensters deaktivierst. Mit dem Löschen des Einstellungsfensters aktivierst Du diese wieder.
Code: Alles auswählen
class Main():
def __init__(self):
self.root = tk.Tk()
menuleiste = tk.Menu(self.root)
self.menue_datei = tk.Menu(menuleiste, tearoff=0)
self.menue_einstellungen = tk.Menu(menuleiste, tearoff=0)
menuleiste.add_cascade(label="Datei", menu=self.menue_datei)
menuleiste.add_cascade(label="Extras",
menu=self.menue_einstellungen)
self.menue_datei.add_command(label="Neu", command=None)
self.menue_einstellungen.add_command(label="Einstellungen",
command=self.erstelle_einstellungs_fenster)
self.root.title("Hauptfenster")
self.root.geometry('1000x800')
self.root.config(menu=menuleiste)
self.root.mainloop()
def erstelle_einstellungs_fenster(self):
self.optionen_fenster = tk.Toplevel()
self.optionen_fenster.title("Einstellungen")
self.optionen_fenster.geometry('500x500')
self.optionen_fenster.resizable(0, 0)
self.optionen_fenster.attributes('-topmost', True)
self.optionen_fenster.wm_protocol('WM_DELETE_WINDOW',
self.beende_optionen_fenster)
# Übergibt dem Icon "self.optionen_fenster schliessen' ->
# -> die Funktion beende_optionen_fenster.
self.entry = tk.Entry(self.optionen_fenster)
self.entry.pack()
self.menue_einstellungen.entryconfigure(1, state='disabled')
# Untermenue Einstellungen wird unwirksam.
self.root.bind("<FocusIn>", self.ruecksetze_focus)
# Bindet das Event FocusIn an das root Fenster.
def ruecksetze_focus(self, event):
self.optionen_fenster.transient(self.root)
# optionen_fenster sichtbar auf root.
self.entry.focus_set()
def beende_optionen_fenster(self):
self.root.unbind("<FocusIn>")
# Löst die Event-Bindung FocusIn vom root Fenster.
self.optionen_fenster.destroy() # Zerstört das optionen_fenster.
self.menue_einstellungen.entryconfigure(1, state='normal')
# Untermenue Einstellungen wird wieder aktiv.
if __name__ == '__main__':
Main()
Gruss Peter