Aus einem Thread eine Dialog auslösen
Verfasst: Mittwoch 8. Juni 2005, 10:59
Hallo zusammen,
Bin neu hier und möchte erstmal alle grüßen.
Also mein Problem:
Ich bin im Begriff ein Client/Server basiertes Pong zu entwickeln. Die Spieler sollen sich auf dem Server einloggen können und dort andere Spieler fordern. Das klappt auch fast, nur dann nicht, wenn ich dem Geforderten die Wahl geben möchte das Spiel anzunehmen oder abzulehnen.
Bei einem Client läuft ein Thread, der auf eingehende Forderungen wartet, mittels einer Queue. Dieser Thread hat eine Referenz auf das TopLevel-Window. In diesem habe ich eine Funktion, die es erlauben sollte einen Ja/Nein Dialog zu öffnen, um die Antwort zurück zu erhalten.
Genau da hängt sich die Applikation immer auf. Sobald eine Anfrage eingeht, färbt sich das Fenster weiss und die App hängt, anstelle das Fenster zu öffnen.
Bin neu hier und möchte erstmal alle grüßen.
Also mein Problem:
Ich bin im Begriff ein Client/Server basiertes Pong zu entwickeln. Die Spieler sollen sich auf dem Server einloggen können und dort andere Spieler fordern. Das klappt auch fast, nur dann nicht, wenn ich dem Geforderten die Wahl geben möchte das Spiel anzunehmen oder abzulehnen.
Bei einem Client läuft ein Thread, der auf eingehende Forderungen wartet, mittels einer Queue. Dieser Thread hat eine Referenz auf das TopLevel-Window. In diesem habe ich eine Funktion, die es erlauben sollte einen Ja/Nein Dialog zu öffnen, um die Antwort zurück zu erhalten.
Genau da hängt sich die Applikation immer auf. Sobald eine Anfrage eingeht, färbt sich das Fenster weiss und die App hängt, anstelle das Fenster zu öffnen.
Code: Alles auswählen
class ChallengeDaemon(threading.Thread):
""" Die Klasse ChallengeDaemon wartet in einem
eigenen Thread auf eingehende Herausforderungen. """
def __init__(self, gotChallengedQueue, rootWindow):
threading.Thread.__init__(self)
self.setDaemon(True)
self.__gotChallengedQueue = gotChallengedQueue
self.__rootWindow = rootWindow
self.start()
def run(self):
""" Startet den Daemon und loest ein Spiel aus,
sobald eine Herausforderung eingeht. Der Server
ueberwacht, ob der Spieler gefordert werden kann
oder nicht """
while True:
data = self.__gotChallengedQueue.get()
self.__rootWindow.acceptChallenge(data[0])
Code: Alles auswählen
def acceptChallenge(self, challenger):
""" Eine Herausforderung wird angenommen und
entsprechend die View gewechselt.
challenger == Name des Herausforderers """
answer = tkMessageBox.askyesno("Forderung",
"Forderung von " + challenger + " annehmen?"
if answer = True:
wantedView = GameFieldOpponent(self, challenger)
self.changeView(wantedView)
self.__client.sendMessage(challenger, "challenge:accepted"
else:
self.__client.sendMessage(challenger, "challenge:declined"