wx.ListCtrl live-aktualisierung

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

wx.ListCtrl live-aktualisierung

Beitragvon nkoehring » Freitag 22. Juni 2007, 14:44

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)...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: wx.ListCtrl live-aktualisierung

Beitragvon gerold » Freitag 22. Juni 2007, 16:04

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:

Re: wx.ListCtrl live-aktualisierung

Beitragvon nkoehring » Freitag 22. Juni 2007, 16:26

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...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: wx.ListCtrl live-aktualisierung

Beitragvon gerold » Freitag 22. Juni 2007, 16:53

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:

Beitragvon veers » Freitag 22. Juni 2007, 19:08

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 22. Juni 2007, 19:14

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:

Beitragvon veers » Freitag 22. Juni 2007, 20:04

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 22. Juni 2007, 20:20

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:

Beitragvon nkoehring » Samstag 23. Juni 2007, 00:01

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 :)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder