Problem mit falsch angezeigtem Dialog

Plattformunabhängige GUIs mit wxWidgets.
sacro_thaan
User
Beiträge: 12
Registriert: Montag 23. Januar 2006, 03:21

Problem mit falsch angezeigtem Dialog

Beitragvon sacro_thaan » Donnerstag 27. April 2006, 04:31

Hallo liebe Gemeinde,

ich habe noch ein Problem gefunden, zu dem ich im Netz der Netze keine Lösung gefunden habe.

Ich habe ein Programm, welches einige Zeit damit verbringt, Daten zu laden, zu bearbeiten und zu speichern. Damit der Benutzer nicht denkt, es würde nichts mehr passieren, wollte ich einen kleinen Dialog zeigen, welcher Rückmeldung über die momentane Tätigkeit gibt.

Dafür habe ich mit eine kleine Klasse PleaseWaitDialog gebastelt. Nun wird dieser Dialog aber nicht richtig angezeigt, bzw. das Label darauf gar nicht.

Um mal zu zeigen was ich meine, hier ein kleines Code-Sample:


Code: Alles auswählen

import wx

class PleaseWaitDialog(wx.Dialog):
    def __init__(self, parent, ID, title, modus):

        wx.Dialog.__init__(self, None, ID, title, style = wx.THICK_FRAME)

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        if modus == "save":
            self.label = wx.StaticText(self, -1, "Saving the evaluation data!\n"
                                      "Please wait.", style = wx.ALIGN_CENTRE)
        if modus == "analysis":
            self.label = wx.StaticText(self, -1, "Running analysis!\n"
                                      "Please wait.", style = wx.ALIGN_CENTRE)

        self.sizer.Add(self.label, 0, wx.ALIGN_CENTRE|wx.ALL, 10)

        self.SetSizer(self.sizer)
        self.sizer.Fit(self)

class MyApp(wx.App):
    def OnInit(self):
        dialog = PleaseWaitDialog(self, -1, "Running analysis", "analysis")
        dialog.Show()
        ##for i in range(0, 100000):
        ##      print i,
        ##dialog.Destroy()
        return True


def main():
    app = MyApp(0)
    app.MainLoop()

   
if __name__ == "__main__":
    main()


Mit auskommentierter Schleife zeigt sich der Dialog so, wie er sein sollte. Mit Schleife zeigt sich der Fehler. Anscheinend Hat der Dialog hier nicht "genug" Zeit, sich richtig zu präsentieren. Da aber das Programm weiterlaufen muss, ist das ein Problem.

Hat hier jemand eine Lösung?

Gruß

Till
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Problem mit falsch angezeigtem Dialog

Beitragvon gerold » Donnerstag 27. April 2006, 12:25

sacro_thaan hat geschrieben:Dafür habe ich mit eine kleine Klasse PleaseWaitDialog gebastelt. Nun wird dieser Dialog aber nicht richtig angezeigt, bzw. das Label darauf gar nicht.

Hi Till!

Wenn du direkt nach dem Anzeigen des Dialogs "wx.Yield()" aufrufst, dann wird die Arbeit kurz an andere Teile des Programms abgegeben, so dass genug Zeit zum Anzeigen bleibt.

Baue einfach jedesmal, wenn sich etwas im Dialog ändert, ein "wx.Yield()" ein.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 27. April 2006, 12:30

Hi Till!

Du könntest für so etwas aber auch "wx.ProgressDialog" verwenden.
Mit der Methode "Update" kannst du auch den Text ändern.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Beitragvon Hannes-Spz » Donnerstag 27. April 2006, 13:07

ich habe erst vorgestern mit einer anderen variante gearbeitet/probiert:

wx.BusyInfo (oder so ähnlich...)
man braucht keine Show(), da sich sofort bei aufruf ein kleiner streifen auf dem bildschirm öffnet und nachdem du fertig gesaved hast, kannst du mit der Destroy()-Methode das fenster wieder schließen!

das einzige argument (oder parameter...), das du an wx.Busyinfo abgeben musst, ist der string, der dann da stehen soll!

(Anmerkung: bei mir zeigt der mauscursor, wenn man ihn darüberbewegt eine sanduhr... könnte also vl. hängen...)

good luck
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
sacro_thaan
User
Beiträge: 12
Registriert: Montag 23. Januar 2006, 03:21

Beitragvon sacro_thaan » Donnerstag 27. April 2006, 14:25

Hi,

Wenn du direkt nach dem Anzeigen des Dialogs "wx.Yield()" aufrufst, dann wird die Arbeit kurz an andere Teile des Programms abgegeben, so dass genug Zeit zum Anzeigen bleibt.


Das wars. Danke. Den ProgressDialog wollte ich nicht verwenden, da ich nicht abschätzen kann, wie lande die entsprechenden Vorgänge dauern. Vielleicht versuche ich es aber auch noch mal damit.

wx.BusyInfo (oder so ähnlich...)
man braucht keine Show(), da sich sofort bei aufruf ein kleiner streifen auf dem bildschirm öffnet und nachdem du fertig gesaved hast, kannst du mit der Destroy()-Methode das fenster wieder schließen!


Wäre schön gewesen, in der Tat, aber bei mir stürzt nach einem Destroy() immer das ganze Programm ab. Werde es also erstmal mit gerolds Variante machen. Werde mir wx.BusyInfo aber mal merken :wink:.

Dank euch beiden und Gruß

Till

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder