Seite 1 von 1

Problem mit falsch angezeigtem Dialog

Verfasst: Donnerstag 27. April 2006, 04:31
von sacro_thaan
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

Re: Problem mit falsch angezeigtem Dialog

Verfasst: Donnerstag 27. April 2006, 12:25
von gerold
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
:-)

Verfasst: Donnerstag 27. April 2006, 12:30
von gerold
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
:-)

Verfasst: Donnerstag 27. April 2006, 13:07
von Hannes-Spz
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

Verfasst: Donnerstag 27. April 2006, 14:25
von sacro_thaan
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