wxPython - Berechnung

Plattformunabhängige GUIs mit wxWidgets.
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Hallo,

ich lasse per wxPython ziemlich rechenintensive Berechnungen durchführen. Das Problem ist, dass sich dadurch die komplette GUI aufhängt und man nichts mehr machen kann. Wie kann man das umgehen?

Danke!
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Danke!
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ich komme noch nicht ganz zurecht,...

http://paste.pocoo.org/show/94151/

Es geht darum, dass in einer großen Datenbank (naja relativ... 100MB) Ergebnisse rausgefiltert werden sollen. Das soll praktisch sofort gehen, wenn man was eingibt. Nun hängt sich logischerweise die Sache immer auf. Deswegen will ich davor gleich den letzten Thread abbrechen und dann den neuen starten, damit die Eingabe nicht so hängt.

Wie kann ich das machen?

Danke!
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

du darfst nicht .run ausführen sondern .start, weil sonst läuft das nicht im Thread :)
Das mit der Rückgabe musst dann auch anderst lösen.
So habs mir mal nochmal genauer angschaut und n bischen geändert: http://paste.pocoo.org/show/94174/
ist aber auf kein Fall schön gelöst und ich weiß auch nicht ob es stimmt weil ich schon länger nix mehr mit wx und Threads gemacht hab und testen konnt ichs auch nicht weil mir dazu module fehlten.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Danke!

wie kann ich nun den Thread mittendrin stoppen bzw. die aktuelle Ausgabe beenden?
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Das musst du irgendwie in run einbauen, also eine var setzn und immer wieder abfragen ob sie gesetzt ist. Einfach so killen kann man nen Thread nicht zumindest wüsste ich nicht wies geht. Du musst also irgendwie deine Berechnungen stückweiße durchführn.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

das gestaltet sich etwas schwierig mit einer Datenbankabfrage^^
dann werd ich wohl einfach zwischen die einzelnen Schritte eine if-Abfrage reinmachen.

Vielen Dank!
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ich habe leider mit einem neuen Problem zu kämpfen und zwar versuche ich die Suchergebnisse in einer ListCtrl auszugeben und bekomme folgenden Fehler:

http://paste.pocoo.org/show/94344/

http://paste.pocoo.org/show/94343/

Das Problem ist in Zele 35-36 und wird in 165-172 aufgerufen.

Was mache ich flasch?

Danke!
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Hallo,

ich glaub das Problem liegt darin dass du versuchst aus den Thread direkt auf die Methode InsertStringItem von ListCtrl versuchst zuzugreifen ohne wx.callafter aufzurufen.

Falls das der Fehler sein sollte könntest du etwas einbauen das die GUI informiert wenn der Thread fertig ist und dann die GUI die Daten abholt.

Oder du schreibst eine Methode wo die Daten der GUI übergeben werden und in einer Methode der GUI-Klasse selbst dem zugehörigen Komponenten zugeordnet werden.

Code: Alles auswählen

for row, result in enumerate(data_list.all()):
            if self.cancel.isSet():
                break
            wx.CallAfter(self.panel.addcontent, row, result)
       
#Methode im Panel
def addcontent(self, row, result):
        index = self.output.InsertStringItem(123,"")
        self.output.SetStringItem(index, 1, result.name)
        self.output.SetItemData(index, row)

Mfg Martin
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Danke!

http://paste.pocoo.org/show/94447/

Hat elider irgendwie nicht 100%ig geholfen, die Elemente werden zar erstellt, aber die Liste ist leer (der Scrollbalken wächst).

Traceback:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python25\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 1457
6, in <lambda>
    lambda event: event.callable(*event.args, **event.kw) )
  File "E:\Software\python\pysearch\pysearch.py", line 131, in add_row
    index = self.InsertStringItem(0, str(content.id))
  File "C:\Python25\lib\site-packages\wx-2.8-msw-unicode\wx\_controls.py", line
4761, in InsertStringItem
    return _controls_.ListCtrl_InsertStringItem(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "!IsVirtual()" failed at ..\..\src\msw\
listctrl.cpp(1594) in wxListCtrl::InsertItem(): can't be used with virtual contr
ols
Was könnte es noch sein?
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Hallo SchneiderWeisse,

ich hab mal in wx Doku nachgelesen. Der Style wx.LC_VIRTUAL ist dafür gedacht das die Daten durch das Programm selbst verwaltet werden, das heißt die Daten werden von Programm selber über Events bei Bedarf angefordert. Daher funktioniert auch InsertStringItem nicht.

Wenn du LC_VIRTUAL benutzen willst musst du dafür einige Methoden von der abgeleiteten Klasse überschreiben. Sieh dir das Beispiel in der wxPython Demo an wie dort das gemacht wurde.

Oder du lasst diesen Style weg dann funktiontierts mit dem einfügen durch die Methode InsertStringItem.

Mfg Martin
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Vielen Dank!

Funktioniert wunderbar.
Antworten