Seite 1 von 1

Aus einem Thread eine Dialog auslösen

Verfasst: Mittwoch 8. Juni 2005, 10:59
von Semerzo
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.

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"