Hallo zusammen,
Ich habe ein Tab-Basiertes TK programm, bei dem verschiedene Tabs andere teils beeinflussen sollen.
Bzw. die anderen sollen ihren Inhalt ändern, wenn in einem bestimmten Tab etwas spezielles durch den Nutzer gemacht wird.
Dafür habe ich beim ersten mal das "<<NotebookTabChanged>>" Event genutzt. Dies ermöglicht es dass bei jedem Tab-Wechsel eine entsprechende Funktion im Tab ausgeführt wird.
Da jeder Tab durch eine eigene Klasse repräsentiert wird, das Event jedoch nur die gewünschte Funtkion in der letzten Klasse ausführt in der es im Code ausgeführt wurde:
tabControl.bind("<<NotebookTabChanged>>", lambda x: self.on_tab_change())
Sehe ich keine möglichkeit dass mehrere Funtkionen in den verschiendenen Klassen bei einem Tab-Wechsel stattfinden können.
Eine möglichkeit das Problem zu umgehen sind weitere Prozesse die dann z.B. alle 100ms den Wert einer globalen Variablen abfragen. Aber ich sehe darin nur eine schlechte Lösung.
Habt ihr vielleicht eine Idee, wie dass "<<NotebookTabChanged>>" mehrfach in unterschiedlichen klassen zum Aufruf von Funktionen benutzt werden kann?
Oder eine ganz alternative lösung für dieses Problem?
Schöne Grüße und vielen Dank, Attega
Tk, "<<NotebookTabChanged>>" - EVENT / in verschiedenen Klassen/Tabs nutzen
Guten Morgen,
bin mir nicht sicher wie du es meinst, wenn ich alle Felder der Tabs in einer Datenstruktur sammeln wollte, wäre diese sehr umfangreich, hätte wohl ca 40 Elemente wobei darunter auch diverse Listboxen wären?
Da müsste ich viel ändern? Oder verstehe ich es falsch?
Oder ich lasse sie von einer Elternklasse erben, die die Funktion des <<NotebookTabChanged>> nutzt um dann alle ihre Kinder an den entsprechenden Stellen upzudaten?
bin mir nicht sicher wie du es meinst, wenn ich alle Felder der Tabs in einer Datenstruktur sammeln wollte, wäre diese sehr umfangreich, hätte wohl ca 40 Elemente wobei darunter auch diverse Listboxen wären?
Da müsste ich viel ändern? Oder verstehe ich es falsch?
Oder ich lasse sie von einer Elternklasse erben, die die Funktion des <<NotebookTabChanged>> nutzt um dann alle ihre Kinder an den entsprechenden Stellen upzudaten?
Wenn Tk nicht unterstützt, dass mehrere Callbacks zu einem Event registriert werden können, musst Du das halt selbst programmieren, z.B. im Hauptfenster, das ja alle Tabs kennt, eine Methode implementiert, das die Update-Methode aller Tabs aufruft.
Und wenn Deine Listboxen auch ein Update brauchen, wo ist das Problem? 40 Funktionsaufrufe sind jetzt ja nicht viel. Und da Du ja objektorientiert unterwegs bist, ist das nur eine kurze Schleife.
Und wenn Deine Listboxen auch ein Update brauchen, wo ist das Problem? 40 Funktionsaufrufe sind jetzt ja nicht viel. Und da Du ja objektorientiert unterwegs bist, ist das nur eine kurze Schleife.
@attega: Nur damit ich das richtig verstehe. Du hast quasi mehrere Tabs. Und die Inhalte der einzelne Tabs können sich ändern, wenn du in einem der Tabs etas veränderst? Als du hast Tab 1 und Tab 2. Und wenn in Tab 1 ein bestimmtes Optionsfeld gedrückt wird, dann wird z. B. in Tab 2 etwas in ein Textfeld eingetragen? Oder ein GUI-Element ausgelendet?
So wie ich das sehe wird das "NotebookTabChanged"-Event immer ausgelöst, wenn ein anderer Tab ausgewählt wird. Also quasi ein "ein neuer Tab wurde ausgewählt und der neue Tab ist dieser". Wenn dem so ist, verstehe ich nicht, wie du dein Problem damit lösten wilst.
Wenn jeder Tab bei dir die Instanz einer Klasse ist, dann muss das Element, das die Tabs beinhaltet eben diese Instanzen kennen. Vielleicht kennt es die sowieso schon. So tief bin ich in tkinter nicht drin.
Aber wenn wir bei dem Beispiel oben bleiben, dann musst du eben, wenn in Tab 1 das Optionsfeld geklickt wird, das die Änderungen in den anderen Tabs vornimmt, diese auch direkt ändern. Also sowas wie parent.tabs[1].textField.setValue("irgendwas") sobald das Optionsfeld geklickt wurde.
So wie ich das sehe wird das "NotebookTabChanged"-Event immer ausgelöst, wenn ein anderer Tab ausgewählt wird. Also quasi ein "ein neuer Tab wurde ausgewählt und der neue Tab ist dieser". Wenn dem so ist, verstehe ich nicht, wie du dein Problem damit lösten wilst.
Wenn jeder Tab bei dir die Instanz einer Klasse ist, dann muss das Element, das die Tabs beinhaltet eben diese Instanzen kennen. Vielleicht kennt es die sowieso schon. So tief bin ich in tkinter nicht drin.
Aber wenn wir bei dem Beispiel oben bleiben, dann musst du eben, wenn in Tab 1 das Optionsfeld geklickt wird, das die Änderungen in den anderen Tabs vornimmt, diese auch direkt ändern. Also sowas wie parent.tabs[1].textField.setValue("irgendwas") sobald das Optionsfeld geklickt wurde.
- __blackjack__
- User
- Beiträge: 14032
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Wobei man ja eigentlich eher jedem Tab das/ein Programmlogik-Objekt mitgibt, und wenn in einem Tab etwas geändert wird, ändert das entsprechend in dem Programmlogik-Objekt a.k.a. Model. Und immer wenn ein anderer Tab aufgerufen wird, wird der ja über das Ereignis informiert und kann seinen eigenen Inhalt anhand des Models aktualisieren.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.