Ausgabe Problem

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Feanor
User
Beiträge: 7
Registriert: Montag 18. August 2008, 18:16

Montag 18. August 2008, 18:29

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()
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 18. August 2008, 18:38

Hallo Feanor, willkommen im Forum,

Nicht Threads sondern ``gobject.idle_add`` ist in diesem Fall dein Freund.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Feanor
User
Beiträge: 7
Registriert: Montag 18. August 2008, 18:16

Montag 18. August 2008, 19:27

Danke, habs hinbekommen
Antworten