2 Fenster instanziert/Prog. crasht

Fragen zu Tkinter.
Antworten
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

Sonntag 30. Juli 2006, 11:11

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".
BlackJack

Sonntag 30. Juli 2006, 12:15

Man darf bei Tk nur ein Hauptfenster, also `Tkinter.Tk()` haben. Zusätzliche Fenster müssen mit `Tkinter.Toplevel()` erstellt werden.
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

Sonntag 30. Juli 2006, 12:57

Ok, wußte ich noch nicht. Danke für die Info :) .
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

Sonntag 30. Juli 2006, 14:30

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.
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Sonntag 30. Juli 2006, 15:56

Das Programm hat ein Hauptfenster und Popups sind Toplevel... davon darfst du so viele instanzieren wie du willst... (wenn's der Speicher mitmacht :))
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

Sonntag 30. Juli 2006, 22:07

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 ?
BlackJack

Sonntag 30. Juli 2006, 22:22

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.
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

Sonntag 30. Juli 2006, 22:24

:!:

Hört sich gut an, danke.
Antworten