Übergabe eines Strings an ein Textpanel

Plattformunabhängige GUIs mit wxWidgets.
The Spirit
User
Beiträge: 274
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

Übergabe eines Strings an ein Textpanel

Beitragvon The Spirit » Donnerstag 28. Februar 2008, 21:21

Hi.
Habe einen Bereich in meinem Script, der nicht so ganz funktioniert, wie ich das gerne hätte.
Als erstes generiere ich mir eine "Infobox" wo während des Prozesses infos reingeschrieben werden können, damit der user weis, was gerade geschieht.

Code: Alles auswählen

#infobox
      wx.StaticText(panel, -1, 'Infobox:', (120, 278))
      self.infobox = wx.TextCtrl(panel, -1, '',  (120, 292), (420, -1), style = wx.TE_READONLY )


Beim letztendlichen starten des Prozesses, will ich das am Anfang "Decoding started!" drinsteht.
Hab es, wie man am Quellcode sieht, es an mehreren stellen drin, jedoch erscheint es nie.
Erst das "Decoding finished" erscheint in der Infobox.



CODE AUSGELAGERT: http://paste.pocoo.org/show/31913/



Jemand nen Tip, was ich falsch mache?
Thx

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

Beitragvon gerold » Donnerstag 28. Februar 2008, 21:31

Hallo The Spirit!

Das sollte helfen:

Code: Alles auswählen

my_textctrl.Refresh()
wx.YieldIfNeeded()

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Whitie
User
Beiträge: 111
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Beitragvon Whitie » Donnerstag 28. Februar 2008, 21:33

Hallo The Spirit,
ich vermute mal, dass SetValue immer den gesamten Text ersetzt und neuen reinschreibt. Somit siehst Du nur den letzten von Dir gesetzten Text, da alles andere an dir 'vorbeifliegt'. Probier mal AppendText stattdessen.

Edit:
Ich sehe gerade erst, dass du zwischendurch die Textbox leer haben willst, dann probier was Gerold geschrieben hat. Sorry.

Gruß
Whitie
The Spirit
User
Beiträge: 274
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

Beitragvon The Spirit » Freitag 29. Februar 2008, 09:22

danke euch beiden.

@ gerold:

wo muss das dann genau rein und wie bekomm ich meinen text da dann rein?

p.s.
noch eine kurze frage zu dem pipe in zeile 19:
pipe ich da jetzt richtig den stdout und stderr in eine variable process, welche ich auslesen kann? (in process sollte ja dann ein string stehen, oder?)
The Spirit
User
Beiträge: 274
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

Beitragvon The Spirit » Mittwoch 5. März 2008, 19:07

keiner, der mir nochmal genauer helfen kann?
thx
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 5. März 2008, 19:14

The Spirit hat geschrieben:keiner, der mir nochmal genauer helfen kann?

Hallo The Spirit!

Hilf mir, dann helf ich dir! Erstelle ein kleines, lauffähiges Programm welches dein Problem aufzeigt.

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

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
The Spirit
User
Beiträge: 274
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

Beitragvon The Spirit » Donnerstag 6. März 2008, 15:11

hi.
hier jetzt ein kurzer teil (selbst lauffähig), was mein problem darstellt.
das print "hallo" klappt einwandfrei in die console, jedoch wird nichts in die infobox in der gui geschrieben

Code: Alles auswählen

import time
import wx


class MyFrame(wx.Frame):

   def __init__(self, parent = None, id = -1, title = "Example", size = wx.Size(700, 500)):
      wx.Frame.__init__(self, parent, id, title, size = size)

      panel = wx.Panel(self)


#infobox
      wx.StaticText(panel, -1, 'Infobox:', (120, 278))
      self.infobox = wx.TextCtrl(panel, -1, '',  (120, 292), (420, -1), style = wx.TE_READONLY )
            
            
            
      self.btn_start = wx.Button(panel, -1, "Start")
      #vbox.Add(self.btn_start, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5)
      self.btn_start.Bind(wx.EVT_BUTTON, self.start) 
      
   def start(self, event):
      self.infobox.Clear()
      self.infobox.SetValue('Decoding started!')
      files = 0
      while files < 10:
         print 'hallo'
         self.infobox.Clear()
         self.infobox.SetValue('Decoding started!')
         time.sleep(5)
         self.infobox.Clear()
         self.infobox.SetValue('Decoding finished!')
      
#

def main():
   """Testing"""
   app = wx.PySimpleApp()
   f = MyFrame()
   f.Center()
   f.Show()
   app.MainLoop()



if __name__ == "__main__":
   main()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 6. März 2008, 16:39

The Spirit hat geschrieben:das print "hallo" klappt einwandfrei in die console, jedoch wird nichts in die infobox in der gui geschrieben

Hallo The Spirit!

Dein Problem ist, dass du mit ``sleep`` den kompletten Prozess (auch das neuzeichnen der GUI) lahm legst.

Mit ``wx.YieldIfNeeded()`` wird das so weit entschärft, dass zuerst die GUI neu gezeichnet wird, bevor diese lahm gelegt wird.

Code: Alles auswählen

    def start(self, event):
        self.infobox.Clear()
        self.infobox.SetValue('Decoding started!')
        files = 0
        while files < 10:
            print 'hallo'
            self.infobox.Clear()
            self.infobox.SetValue('Decoding started!')
            wx.YieldIfNeeded()
            time.sleep(2)
            self.infobox.Clear()
            self.infobox.SetValue('Decoding finished!')
            wx.YieldIfNeeded()
            time.sleep(2)

Aber das ist KEINE LÖSUNG!

Wenn du eine Arbeit hast, die länger dauert, dann musst du diese in einen eigenen Thread auslagern. Beispiel dafür gibt es hier im Forum genug. Suche nach "wx.CallAfter".

Hier die Links, die ich auf die Schnelle gefunden habe:
- http://www.python-forum.de/topic-5757.h ... =callafter
- http://www.python-forum.de/topic-10141. ... =callafter
- http://www.python-forum.de/topic-10704. ... =callafter
- http://www.python-forum.de/topic-12193. ... =callafter

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

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder