Button auf Mainwindow sperren während toplevel window geöffnet ist

Fragen zu Tkinter.
Antworten
NinoBaumann
User
Beiträge: 72
Registriert: Samstag 25. April 2020, 19:03

Hallo,

ich bin gerade dran eine App zu schreiben. Die ist jetzt schon etwas größer, deswegen habe ich mal alles rausgeschmissen bis auf das, was für die Frage von Relevanz ist. Ich habe ein Hauptfenster. In diesem sind verschieden Dropdown Menus und Buttons. Jetzt öffne ich über einen Button im Hauptfenster ein neues Toplevel Fenster. In der Zeit sperre ich bspw. den Button. Jetzt hätte ich gerne im Toplevel Fenster einen Button, mit dem ich das Toplevel Fenster schließen kann und gleichzeitig den Knopf im Hauptfenster wieder entsperren kann. Kann mir hier jemand helfen?
Danke im Voraus.

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

class EquationGenerator(ttk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        
        self.button2 = ttk.Button(self, text='close toplevel')
        self.button2.grid(row=1, column=1)
        
        self.button3 = ttk.Button(self, text='close')
        self.button3.grid(row=1, column=0)
        
class MainWindow(ttk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        
        self.button1 = ttk.Button(self, text='open EquationGenerator', command=self.open_new_window)
        self.button1.grid(row=1, column=1)
        
    def open_new_window(self):
            
        self.new_window = tk.Toplevel(self)
                        
        self.equation_generator = EquationGenerator(self.new_window)
        self.equation_generator.grid(row=1, column=0, pady=10)
        
        self.button1.configure(state=tk.DISABLED)

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('Parameteranpassung')        
        self.main_window = MainWindow(self)
        self.main_window.grid(row=0, column=0)        

if __name__ == "__main__":
    app = App()
    app.mainloop()
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

`self.new_window.destroy()`?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht mit grab_set.

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

class EquationGenerator(tk.Toplevel):
    def __init__(self, parent):
        super().__init__(parent)
        frame = tk.Frame(self)
        frame.pack()
        frame.grid(row=1, column=0, pady=10)
        self.button3 = ttk.Button(frame, text='close', command=self._close)
        self.button3.grid(row=1, column=0)

    def _close(self):
        self.destroy()

class MainWindow(ttk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.button1 = ttk.Button(self, text='open EquationGenerator', command=self.open_new_window)
        self.button1.grid(row=1, column=1)

    def open_new_window(self):
        new_window = EquationGenerator(self)
        new_window.grab_set()


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('Parameteranpassung')
        self.main_window = MainWindow(self)
        self.main_window.grid(row=0, column=0)

if __name__ == "__main__":
    app = App()
    app.mainloop()
NinoBaumann
User
Beiträge: 72
Registriert: Samstag 25. April 2020, 19:03

Hallo deets,

danke erstmal für den Vorschlag. Aber was ist, wenn ich nur ausgewählte Buttons oder Dropdown Menus sperren möchte anstatt das komplette Fenster? Es sollte trotzdem noch möglich sein einige Funktionen im Hauptfenster ausführen zu können.
__deets__ hat geschrieben: Freitag 12. April 2024, 12:32 Das geht mit grab_set.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist ein ziemlich gurkiger Entwurf. Aber wenn’s sein muss, musst du eben von Hand all die Elemente deaktivieren, die nicht benutzt werden sollen. Und wieder aktivieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und auch dran denken, dass der Benutzer das Fenster über die Titelzeile des Fenstern schliessen kann, statt über den Button im Fenster.

Alternativ könnte man auch statt den Button im Hauptfenster zu deaktivieren, einem bereits offenen `EquationGenerator`-Fenster den Fokus geben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
NinoBaumann
User
Beiträge: 72
Registriert: Samstag 25. April 2020, 19:03

Hallo blackjack,

danke für den Hinweis, werde ich beachten.
__blackjack__ hat geschrieben: Montag 15. April 2024, 06:51 Und auch dran denken, dass der Benutzer das Fenster über die Titelzeile des Fenstern schliessen kann, statt über den Button im Fenster.

Alternativ könnte man auch statt den Button im Hauptfenster zu deaktivieren, einem bereits offenen `EquationGenerator`-Fenster den Fokus geben.
NinoBaumann
User
Beiträge: 72
Registriert: Samstag 25. April 2020, 19:03

Bitte unterlasse in Zukunft abwertende Aussagen wie bspw. gurkig. Das hat in einem Forum nichts zu suchen. Es mögen bestimmt einige meiner Fragen und Ansätze für Profis wie Dich seltsam wirken. Aber ich bin hier zum lernen und dann möchte man sich keine abwertende Bemerkungen anhören müssen. Ich bin kein jahrelang geübter Anwender, beschäftige mich nicht täglich mit der Materie und bin auch kein studierter Programmierer, sondern Naturwissenschaftler am Fraunhofer Institut. Und glaube mir eins, auch ich hätte Frage- und Aufgabenstellungen für Dich, an denen Du, um es in deiner Sprache auszudrücken, gurkig, scheitern würdest.
__deets__ hat geschrieben: Montag 15. April 2024, 06:39 Das ist ein ziemlich gurkiger Entwurf. Aber wenn’s sein muss, musst du eben von Hand all die Elemente deaktivieren, die nicht benutzt werden sollen. Und wieder aktivieren.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Gestaltung von Benutzerschnittstellen gehört ebenso wie programmieren zu den Dingen, die man lernen kann. Muss man nicht, aber genauso wie bei Code nehme ich mir das Recht heraus, darauf hinzuweisen, wenn ich Probleme mit einem Ansatz sehe. Und “gurkig” ist nun wirklich dermaßen harmlos, das ich da keine Chance sehe, das wir hier auf einen Nenner kommen. Aber müssen wir ja ja auch nicht, ich werde darum einfach in Zukunft deine Fragen nicht kommentieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich finde das völlig normal einen Button zu haben der ein Fenster öffnet und solange das offen ist, deaktiviert ist, wenn es keinen Sinn macht das Fenster noch mal zu öffnen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich finde Mehrfensteranwendungen, bei denen man mit verschiedenen Fenstern gleichzeitig hantiert, gurkig. Das steht nicht für “abgrundtief schlecht und der Ersteller ist ein Vollpfosten”, entgegen der Wahrnehmung hier. Sondern das es eine hakelige und umständliche Art der Interaktion ist, die auch aus wenigen Programmen so kenne. GIMP hatte sowas ja, und das war jahrelang ein sehr kontrovers diskutiertes Thema, bis sie zu einem single window Ansatz gewechselt sind. Mit Paletten, aber das ist ja nochmal was anderes.

Aber selbst wenn wir mal annehmen, das es so sein muss, dann ist es immer noch schlecht, den Button zu sperren. Denn wenn man - wie es unter Desktop-Systemen üblich ist- unter den mehreren offnen Fenster das mit dem Button erwischt hat, dann möchte ich genau NICHT, das der gesperrt ist. Sondern durch nochmaligen Druck darauf eben das Fenster wieder in den Fokus rückt.

Aber ist natürlich alles Geschmackssache. Wie zb auch die Frage, ob globale Variablen, Code auf Modulebene oder “from tkinter import *” immer und unbedingt gurkig sind, auch wenn sie akut kein Problem darstellen. Sondern nur eines werden könnten, in einer fernen Zukunft.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: GIMP hat das immer noch, und hatte auch schon lange einen Ein-Fenster-Ansatz als mehrere Fenster noch die Standardeinstellung waren. Man kann das umstellen. Ich fand das damals mit einem Monitor schon praktisch, weil ich mit mehreren Desktops gearbeitet habe, und heute ist das praktisch wenn man nicht alles in einem Fenster abhandeln muss, wenn man Fenster auf mehr als einen Monitor verteilen kann. Gerade bei GIMP wo man dann mehrere Bilder oder Ansichten auf die Monitore verteilen kann. Zum Beispiel um eine Vorlage immer im Blick zu haben, oder Versionen von Bildern vergleichen zu können.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
NinoBaumann
User
Beiträge: 72
Registriert: Samstag 25. April 2020, 19:03

Damit kann ich gut leben. Trotzdem vielen Dank für den konstruktiven Austausch ^^
__deets__ hat geschrieben: Montag 15. April 2024, 11:18 Die Gestaltung von Benutzerschnittstellen gehört ebenso wie programmieren zu den Dingen, die man lernen kann. Muss man nicht, aber genauso wie bei Code nehme ich mir das Recht heraus, darauf hinzuweisen, wenn ich Probleme mit einem Ansatz sehe. Und “gurkig” ist nun wirklich dermaßen harmlos, das ich da keine Chance sehe, das wir hier auf einen Nenner kommen. Aber müssen wir ja ja auch nicht, ich werde darum einfach in Zukunft deine Fragen nicht kommentieren.
Antworten