wx.ListCtrl live-aktualisierung

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

hallo mal wieder...

Ich hab hier so ne schicke wx.ListCtrl in meinem Programm in der die Clients aufgezaehlt werden.
Wenn ich nun den (fast genauso schicken ;) ) connect-Button druecke, wird eine Funktion aufgerufen, die nacheinander die Server durchgeht und versucht zu verbinden:

Code: Alles auswählen

    def updateConnectedHosts(self, evt):
        #clients = list() # brauch ich spaeter... vielleicht
        i=0
        #p2p_info ist eine liste von entsprechenden 2er-tuples
        for ip, name in p2p_info:
            print ip, name
            if self.p2p_connectedList.GetItem(i, 2).GetText() == "not connected":
                self.p2p_connectedList.SetStringItem(i, 2, "trying to connect")
                self.p2p_connectedList.Refresh()
                client = Client("PYROLOC://"+ip+":7766/test")
                try: client.run()
                except: pass
                if client.connected():
                    self.p2p_connectedList.SetStringItem(i, 2, "connected")
                    self.p2p_connectedList.Refresh()
                else:
                    self.p2p_connectedList.SetStringItem(i, 2, "not connected")
                    self.p2p_connectedList.Refresh()
                time.sleep(1)
            i+=1
Also an sich funktioniert das auch ganz gut... bis auf das die Liste nicht aktualisiert wird, bevor er alle Server durchprobiert hat.
Ich hab schon extra mal ein sleep(1) eingebaut, aber das hilft genauso wenig wie das .Refresh(). ...woran liegt das?

Danke schonmal und Gruesse aus Sachsen-Anhalt...

EDIT: vielleicht sollte noch erwaehnt werden, dass die Client-Klasse von Thread aberbt und Pyro zur Netzwerkkommunikation benutzt (sieht man ja bei der Instanzierung)...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

nkoehring hat geschrieben:

Code: Alles auswählen

                try: client.run()
                except: pass
Hallo nkoehring!

1.) ``client.run()`` != ``client.start()``
2.) Welchen Fehler willst du denn abfangen?

Mehr fällt mir im Moment nicht dazu ein.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

gerold hat geschrieben:
nkoehring hat geschrieben:

Code: Alles auswählen

                try: client.run()
                except: pass
Hallo nkoehring!

1.) ``client.run()`` != ``client.start()``
oops :oops:
gerold hat geschrieben:2.) Welchen Fehler willst du denn abfangen?
Den "ich kann nicht verbinden"-Fehler von Pyro...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

nkoehring hat geschrieben:
gerold hat geschrieben:2.) Welchen Fehler willst du denn abfangen?
Den "ich kann nicht verbinden"-Fehler von Pyro...
Hi nkoehring!

Dann würde ich auch nur diesen Fehler abfangen. "Alles abfangen" ist viel zu gefährlich. Da kann es passieren, dass dein Programm nicht korrekt funktioniert und du kriegst nichts davon mit. -- Gerade an einer so sensiblen Stelle.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Zu deinem Problem, du musst vermutlich den Mainloop die Kontrolle zurückgeben damit er das Refreshen kann. An deiner Stelle würde ich mal die Doku danach durchsuchen. Die Alernative ist die Funktion aufzuteilen und über Events o.ä. in den Mainloop zu integrieren. Oder (natürlich) Threads.

Im wiki gibt es auch nicht etwas Dokumentation dazu:
http://wiki.wxpython.org/LongRunningTas ... %28long%29

Edit:
Die Funktion heisst wx.Yield. Ersetz also mal das Refresh durch das wx.Yield
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

veers hat geschrieben:Edit:
Die Funktion heisst wx.Yield. Ersetz also mal das Refresh durch das wx.Yield
Hallo!

Das möchte ich noch durch die sichereren Formen ``wx.YieldIfNeeded()`` und ``wx.SafeYield()`` ergänzen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

gerold hat geschrieben:
veers hat geschrieben:Edit:
Die Funktion heisst wx.Yield. Ersetz also mal das Refresh durch das wx.Yield
Hallo!

Das möchte ich noch durch die sichereren Formen ``wx.YieldIfNeeded()`` und ``wx.SafeYield()`` ergänzen.
Hm das SafeYield verstehe ich nicht so ganz, wieso sollte ich sämtlichen Input Blocken wollen? :?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

veers hat geschrieben:Hm das SafeYield verstehe ich nicht so ganz, wieso sollte ich sämtlichen Input Blocken wollen?
Hallo veers!

Ich bin mir nicht ganz sicher. Es könnte vielleicht so sein:

Jede Aktion, sei es das Bewegen der Maus oder das Eingeben eines Buchstaben über die Tastatur, äußert sich im wxPython als eine Reihe von Events. Jedes Event kann aber wieder zusätzliche Aktionen nach sich ziehen. Z.B. könnte es sein, dass wenn ich die Taste "A" auf der Tastatur drücke, der Fensterhintergrund gelb eingefärbt werden soll.

Dieses gelb Einfärben und auch die Anzeige des neuen Buchstabens muss irgendwie von dem MainLoop durchgeführt werden. Wenn ich jetzt einfach nur mit wx.Yield() ein kurzes Zeitfenster zur Abarbeitung dieser Arbeiten gebe, dann könnte es sein, dass für die Folgeaktionen keine Zeit mehr bleibt... :K

Wenn ich jetzt aber Benutzereingaben (Maus, Tastatur, ...) blocke, bis alles abgearbeitet wurde, dann können mir Folgeaktionen nicht in die Quere kommen.

``wx.Yield()`` ist mir schon ein paar Mal um die Ohren geflogen, als ich es in Schleifen (schnell hintereinander) eingesetzt habe. Seit ich ``wx.YieldIfNeeded()`` verwende, gibt es diese Probleme nicht mehr. ``wx.SafeYield()`` setze ich ziemlich selten ein, da ich es noch nicht so im Gefühl habe, wann ich es brauche und wann nicht. Mir kommt es aber (gefühlt) so vor, dass ein ``wx.SafeYield()`` nicht in Schleifen (schnell hintereinander) eingesetzt werden sollte, da es das Programm merkbar sperrt.

Ich weiß nicht mehr woher ich diese Informationen habe. Vielleicht steht ja irgendetwas davon in "wxPython in Action".

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

hallo...

ich hab es jetzt ueber die Threads geloest. Danke nochmal an gerold, fuer den Hinweis, dass Thread.start() != Thread.run() ist :oops:

jetzt klappt es soweit erstmal :)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten