Seite 1 von 1

2 Fenster instanziert/Prog. crasht

Verfasst: Sonntag 30. Juli 2006, 11:11
von prof_weirdo
Hallo, ich habe folgendes Problem:

Wenn ich 2 Fensterobjekte instanziere crasht mein Programm (bis auf 1 mal).
Hier der Code:

Code: Alles auswählen

import Tkinter, threading


class Window(threading.Thread):
    def __init__(self, label_txt):
        threading.Thread.__init__(self)
        self.label_txt = label_txt
        self.start()

    def run(self):
        self.window = Tkinter.Tk()
        self.label = Tkinter.Label(self.window, text=self.label_txt)
        self.label.pack()
        self.window.mainloop()

w1 = Window("eins")
w2 = Window("Zwei")
print "test"
Das Programm wird zwar ohne Fehlermeldung ausgeführt. es werden 2 Fenster geöffnet (allerdings werden die schon nicht richtig dargestellt) und ich bekomme in der Konsole auch die Ausgabe "test".
Keins der Fenster ist aber mehr "ansprechbar".

Verfasst: Sonntag 30. Juli 2006, 12:15
von BlackJack
Man darf bei Tk nur ein Hauptfenster, also `Tkinter.Tk()` haben. Zusätzliche Fenster müssen mit `Tkinter.Toplevel()` erstellt werden.

Verfasst: Sonntag 30. Juli 2006, 12:57
von prof_weirdo
Ok, wußte ich noch nicht. Danke für die Info :) .

Verfasst: Sonntag 30. Juli 2006, 14:30
von prof_weirdo
BlackJack hat geschrieben:Man darf bei Tk nur ein Hauptfenster, also `Tkinter.Tk()` haben. Zusätzliche Fenster müssen mit `Tkinter.Toplevel()` erstellt werden.
Ist das eigentlich bei wxPython anders ? Ist nicht grad praktisch für mein Programm.

Das Programm soll im Hintergrund laufen und zu bestimmten Zeitpunkten eine Meldung in Form eines Popupwindows absetzen, da scheint mir Tkinter unter diesen Umständen nicht sehr geeignet.

Verfasst: Sonntag 30. Juli 2006, 15:56
von jAN
Das Programm hat ein Hauptfenster und Popups sind Toplevel... davon darfst du so viele instanzieren wie du willst... (wenn's der Speicher mitmacht :))

Verfasst: Sonntag 30. Juli 2006, 22:07
von prof_weirdo
Hmm... das Problem das ich habe ist folgendes:

es gibt mehrere Nachrichten innerhalb eines Zeitraumes, z.B. eines Tages. Bei jeder weiteren Benachrichtigung soll sich wieder ein Window öffnen, egal ob das Hauptwindow Tk() inzwischen weggeclickt wurde oder nicht.

Wenn ich das Hauptfenster lasse und nicht schliesse werden die Toplevel() geöffnet... sollte aber jemand nach der ersten Benachrichtigung das Hauptfenster schliessen erscheinen die nachfolgenden Toplevels nicht.

Es ist somot also nicht gewährleistet das der User in jedem Fall seine Benachrichtigung erhält... :?

Oder habe ich da was übersehen ?

Nachtrag:

Oder ist es möglich zu testen ob noch das Fenster Tk() offen ist und dementsprechend mit einer instanzierung eines Tk() (wenn es inzwischen geschlossen worden ist) oder eines Toplevel() (wenn das Tk() noch offen ist) zu reagieren ?

Verfasst: Sonntag 30. Juli 2006, 22:22
von BlackJack
Du musst einfach verhindern dass das Tk-Fenster geschlossen wird. Das heisst ja nicht, das es *sichtbar* sein muss. Erzeuge es einfach, verstecke es dann (`withdraw()`) und öffne alle Benachrichtigungen als Toplevel. Dann brauchst Du bei den Benachrichtigungen keine Unterscheidungen machen.

Verfasst: Sonntag 30. Juli 2006, 22:24
von prof_weirdo
:!:

Hört sich gut an, danke.