Seite 1 von 1

Übergabe eines Strings an ein Textpanel

Verfasst: Donnerstag 28. Februar 2008, 21:21
von The Spirit
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

Verfasst: Donnerstag 28. Februar 2008, 21:31
von gerold
Hallo The Spirit!

Das sollte helfen:

Code: Alles auswählen

my_textctrl.Refresh()
wx.YieldIfNeeded()
mfg
Gerold
:-)

Verfasst: Donnerstag 28. Februar 2008, 21:33
von Whitie
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

Verfasst: Freitag 29. Februar 2008, 09:22
von The Spirit
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?)

Verfasst: Mittwoch 5. März 2008, 19:07
von The Spirit
keiner, der mir nochmal genauer helfen kann?
thx

Verfasst: Mittwoch 5. März 2008, 19:14
von gerold
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
:-)

Verfasst: Donnerstag 6. März 2008, 15:11
von The Spirit
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()

Verfasst: Donnerstag 6. März 2008, 16:39
von gerold
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
:-)