Übergabe eines Strings an ein Textpanel

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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

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: 276
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

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: 276
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

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

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: 276
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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.
Antworten