wxPython und ein Thread

Plattformunabhängige GUIs mit wxWidgets.
Antworten
baracuda
User
Beiträge: 21
Registriert: Mittwoch 5. November 2008, 13:08

Hallo!

Ich habe damit angefangen, einen kleinen Twitter-Client zu programmieren. Der Programmstart soll so aussehen, dass zwei Threads aufgemacht werden: einer für die UI, und der andere soll den Feed downloaden und parsen. Ich habe nicht viel Ahnung von Threads, hab mir auch nicht viel Zeit zum einlesen in die Thematik genommen, aber trotzdem verstehe ich den Fehler nicht.
Als hat mir der Error-Code gesagt, dass das, was ich in eine ListCtrl einfügen will, kein gtkTreeItem ist (es war leider nicht reproduzierbar, deswegen habe ich nicht den original Errorcode, es würde aber auf einen Bug in wxGTK schliessen lassen).
Und heute, zweimal hintereinander, verschiedene Errors:

#1:
The program 'python' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadDrawable (invalid Pixmap or Window parameter)'.
(Details: serial 5061 error_code 9 request_code 70 minor_code 0)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)
#2:
python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0.
In meinem Code selbst lasse ich im Konstruktor der Klasse einfach die GUI mit wx erstellen, am Ende werden folgende Methoden aufgerufen (ich habe vorher natürlich das thread-Modul importiert):

Code: Alles auswählen

tc = TwitterClient()
thread.start_new_thread(tc.fetchPublicTimeline, ())
tc.main()
fetchPublicTimeline:
self.lc sei hier die ListCtrl, resp das, was aus dem feedparser modul herausfällt

Code: Alles auswählen

for i in range(0, len(resp)):
	item = resp[i]['title']
	time = resp[i]['date']
	self.lc.Append([time, item])
main:

Code: Alles auswählen

def main(self):
	self.app.MainLoop()
Ich bedanke mich schonmal im Voraus für die Antworten.
mfg baracuda

----
Umgebung:
Fedora 11
python 2.6
wxPython 2.8.9.2 (gtk2-unicode)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!.

Du darfst von einem zweiten Thread aus nicht auf die GUI zugreifen, schau dir dazu mal die after-Methode von Wx an. Außerdem solltest du besser das [mod]threading[/mod]-Modul verwenden und nicht das [mod]thread[/mod]-Modul.

Die gezeigte for-Schleife kannst du auch besser implementieren: 0 brauchst du beispielsweise nicht als Startwert angeben. Wenn du "for i in range(len(eggs))" in einer for-schleife benutzt solltest du dir Gedanken machen. Du kannst direkt über die Items iterieren und meintest wahrscheinlich "for egg in eggs". Wenn du den Index doch mal brauchst, dann existiert noch die "enumerate"-Funktion.
Das Leben ist wie ein Tennisball.
baracuda
User
Beiträge: 21
Registriert: Mittwoch 5. November 2008, 13:08

Danke für die Tipps, EyDu.

Ich weiss, dass ich da gelegentlich optimieren muss, in erster Linie sollte es meiner Meinung nach erstmal funktionieren.
Und irgendwie hab ich mir gleich gedacht, dass es nicht so einfach sein kann :wink:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Meine Vorschläge haben alle nichts mit Optimierung zu tun, das sind alles Hinweise für vernünftigen Code. Und den solltest du immer schreiben ;-)
Das Leben ist wie ein Tennisball.
Antworten