wxPython und eigener Thread

Plattformunabhängige GUIs mit wxWidgets.
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich möchte gerne Verzeichnisse rekursiv durchsuchen und mir die Verzeichnisse in einem wxDialog anzeigen lassen. Damit der Dialog nun nicht freezt, habe iich natürlich, das Duchsuchen in einem eigenen Thread gestartet. Diesem Thread gebe ich auch gleich meine DialogKlasse mit, damit dieser dann auf meine Objekte ( Textfeld ) zugreifen kann. So weit funtzt das auch ganz gut, allerdings nach 2-3 Sekunden ändert sich das Textfeld nicht mehr, obwohl ich dort den aktuellen Pfad rein schreibe.
Das ganze sieht so aus:

Code: Alles auswählen

def clearDropBox (fenster):
    for root, dirs, files in os.walk('/home'):
		# fenster.text_ctrl_pfad.Update ()
		for file in files:
			fenster.text_ctrl_pfad.SetValue (os.path.join(root, file))
			if fnmatch.fnmatch(file, '*conflicted*.*') or fnmatch.fnmatch (root, '*conflicted*.*'):
				print (os.path.join(root, file))
    fenster.Destroy ()

if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    cleardropbox = wx_cleardropbox(None, -1, "")
    app.SetTopWindow(cleardropbox)
    cleardropbox.Show()
    start_new_thread(clearDropBox,(cleardropbox,))
    app.MainLoop()
Für die ersten Sekunden sieht alles gut aus aber nach einiger Zeit, bleibt einfach ein alter Pfad drin stehen, obwohl ich einen eigenen Thread nutze. Weiß jemand, warum das so ist?
BlackJack

@The Hit-Man: Bei GUI-Toolkits darf man in der Regel nur von dem Thread aus auf die GUI zugreifen, in dem auch die Hauptschleife des Toolkits läuft. Das ist auch bei `wx` so. Wenn man das nicht beachtet, kann alles mögliche passieren, bis hin zu harten Programmabstürzen.

`wx.PostEvent()` ist "thread safe". Du könntest Dir also ein eigenes Event definieren und damit aus dem Thread den aktuellen Dateinamen an die GUI senden.
Antworten