wx.Dialog im Thread

Plattformunabhängige GUIs mit wxWidgets.
Antworten
JanDMC
User
Beiträge: 95
Registriert: Donnerstag 23. September 2004, 19:35
Kontaktdaten:

Mittwoch 8. März 2006, 15:59

Hi Leute,

Ich habe folgendes Problem, ich habe eine Methode die in einem Thread läuft. In dieser Methode wird nun eine andere Methode aufgerufen,die einen wx.Dialog erzeugt, dies passiert auch noch, aber das Fenster bleibt hängen. Da ich noch nicht soviel erfahrung mit threads habe, weiss ich auch nicht genau woran das liegt...

Ich hab hier ein Beispiel, was den gleichen Effekt hervorruft.

Ich hoffe ihr habt eine Lösung

mfg JanDMC

Code: Alles auswählen

import thread , wx

class GuiFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,parent=None,size=wx.Size(200,200))

        button=wx.Button(parent=self,id=5)
        button.Bind(wx.EVT_BUTTON,self.openThread,id=5)

    def openThread(self,event):
        thread.start_new_thread(self.callDialog,())

    def callDialog(self):
        self.openDialog()

    def openDialog(self):
        dlg=wx.Dialog(parent=None)
        dlg.Show()
        raw_input()

class AppFrame(wx.App):
    def OnInit(self):
        frame=GuiFrame()
        frame.Show(True)
        return True


a=AppFrame(False)
a.MainLoop()
Zuletzt geändert von JanDMC am Donnerstag 9. März 2006, 11:58, insgesamt 1-mal geändert.
joa nää python is toll :D
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Mittwoch 8. März 2006, 16:31

Hm, ich bin ja auch nicht so der Experte in threads.

Suche mal in den wxPython Wiki pages nach thread.

z.B. http://wiki.wxpython.org/index.cgi/LongRunningTasks

Eines weiss ich jedoch: :)

In einem Thread sollte oder darf man keine GUI Elemente erstellen oder
updaten.

Das geht immer so:
Im Thread schickt man ein Event (normal wx.PostEvent glaube ich).

Der Mainthread (das normal Programm) empfänft das Event,
und macht dann etwas entsprechendes (erstellt wx.MessageBox, updates
ein Progresswindow, ...).

In das event kannst du auch parameter mitliefern.
Z.B. eigene id, commandevent, parameter 70,

Diesen Wert kann z.B. bedeuten, dass der progressdialog 70% vom Endwert anzeigen soll.
JanDMC
User
Beiträge: 95
Registriert: Donnerstag 23. September 2004, 19:35
Kontaktdaten:

Donnerstag 9. März 2006, 12:16

OK, wir man das Event an den Main Thread schickt weiss ich glaub ich , müsste mit wx.PostEvent(parameter1,parameter2) gehe.

Nur was für Parameter werden erwartet?

Jetzt muss ich nur wissen , wie ich das Event abfangen kann also einfach mit self.Bind( wx.EVT_---,handler,id) oder anders ?

mfg Jan
joa nää python is toll :D
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Donnerstag 9. März 2006, 21:18

JanDMC hat geschrieben:OK, wir man das Event an den Main Thread schickt weiss ich glaub ich , müsste mit wx.PostEvent(parameter1,parameter2) gehe.

Nur was für Parameter werden erwartet?

Jetzt muss ich nur wissen , wie ich das Event abfangen kann also einfach mit self.Bind( wx.EVT_---,handler,id) oder anders ?

mfg Jan
Argg, ich mag keine Threads :)

Ich kenne mich auch nicht so aus, wie bereits gesagt :)

Hast du das Sample in wxPyhton Demo Threads schon angesehen?


Ich hab das schon mal gemacht, ist aber schon ca. 2 Jahre her
Es ist dein eigenes event, daher kannst du die Paramter angeben, wie du willst.

z.B. (was ich noch gefunden habe; das war noch mit dem alten wx namespace)

Code: Alles auswählen

    event = wxCommandEvent ()
    event.SetEventType (wxEVT_COMMAND_BUTTON_CLICKED)
    event.SetId (20001)
    Globals.g_strTitle
    Globals.g_strTitle = szPath

    #DECLARE_APP(AtolApp)
    pFrm = wxGetApp().GetFrame()
    if(pFrm):
        wxPostEvent(pFrm, event)

    Globals.g_thread_event.wait ()
    return Globals.g_nGuiResult;


Mainthreay.py

        EVT_BUTTON(self, 20001, self.OnDeleteDirDlg)

    def OnDeleteDirDlg(self, event):
        Globals.g_nGuiResult = 0;

        dlg = CDirDeleteDlg ()
        dlg.m_wndInfoLabel.SetLabel(_("Directory %s is not empty! Delete?") % Globals.g_strTitle)

        Globals.g_nGuiResult = dlg.ShowModal();
        Globals.g_thread_event.set ()



Ob das so optimal war oder ob Du Dich hier auskennst ist eine andere Frage.

Sonst bitte in der wxPyhton Mailing List fragen.
:D
Antworten