Seite 1 von 1

Ausgabe Problem

Verfasst: Montag 18. August 2008, 18:29
von Feanor
Ich habe erst angefangen mich mit Python zu befassen und bin schon auf ein Problem gestoßen dass ich nicht lösen kann.

Ich habe versucht ein simples Programm zum Berechnen vom Primzahlen zu schreiben. Es hat eine kleine Oberfläche in Pygtk. Nun möchte ich, wenn ich auf Start klicke im TextView "Gestartet" drin stehen haben bis fertig gerechnet ist. Danach soll "Fertig" ausgegeben werden. Irgendwie bekomme ich aber nur entweder "Fertig" oder "Gestartet" ausgegeben. Ich denke das Problem ist, dass ich nicht in die MainLoop komme um das Ausgabe Widget neu zu Zeichen. Deswegen habe ich versuch das ganze als Thread zu schreiben ... selbes Ergebnis

Bitte um Hilfe

#--------------------------------------------------------------------------

Code: Alles auswählen

#!/usr/bin/python

import pygtk
pygtk.require('2.0')
import gtk
from threading import Thread

class Primzahl_gui:

	def __init__(self):
		self.window=gtk.Window(gtk.WINDOW_TOPLEVEL)
		self.out=gtk.TextView()
		self.start=gtk.Button("Start")
		self.vbox=gtk.VBox(False,0)
		self.text=gtk.TextBuffer()

		self.window.connect("delete_event",self.destroy)
		self.window.connect("destroy",self.destroy)
		self.window.set_border_width(10)
	
		self.start.connect("clicked",self.calc,None)
		self.out.set_buffer(self.text)		

		self.window.add(self.vbox)
		self.vbox.pack_start(self.out)
		self.vbox.pack_start(self.start)

		self.window.show()
		self.vbox.show()
		self.out.show()
		self.start.show()

	def destroy(self, widget, data=None):
		gtk.main_quit()

	def calc(self,widget, data=None):
		prim=Primzahl(self.out.get_buffer())
		prim.start()	

	def main(self):
		gtk.main()

class Primzahl(Thread):

	def __init__(self,text):
		Thread.__init__(self)
		self.text=text

	def run(self):
		self.text.set_text("Gestartet")
		self.datei=file("primzahlen.txt","w")

		for i in range(2,10000):
			for y in range(2,i):
				if(i%y==0):
					break
			else:
				self.datei.write("%s "%i)	
		
		self.datei.close()
		self.text.set_text("Fertig")

prog = Primzahl_gui()
prog.main()

Verfasst: Montag 18. August 2008, 18:38
von Leonidas
Hallo Feanor, willkommen im Forum,

Nicht Threads sondern ``gobject.idle_add`` ist in diesem Fall dein Freund.

Verfasst: Montag 18. August 2008, 19:27
von Feanor
Danke, habs hinbekommen