Externes C++ Programm aus Python/Tkinter Oberfläche aufrufen

Fragen zu Tkinter.
Antworten
Philipp

Hallo!

Ich versuche gerade ein C++ Programm aus einem mit Tkinter erstellten GUI aufzurufen. Ausserdem hätte ich gerne, dass mein GUI mir Bescheid sagt, ob das Programm noch läuft oder nicht. Allerdings funktioniert das nicht so, wie ich mir das vorstelle.

Zunächst einige Programmschnipsel:

Code: Alles auswählen

[...]
def create_widgets(self):

	[...]
	self.RUN_button["command"] =  self.RUN_PROGRAMM
	[...]

	self.RUN_PROGRAMM_now_status_var=StringVar()
	self.RUN_PROGRAMM_now_status = Label (root, textvariable=self.RUN_PROGRAMM_now_status_var)
	self.RUN_PROGRAMM_now_status.configure(fg="blue")
	self.RUN_PROGRAMM_now_status_var.set("Status")
	[...]

	self.master.after(1000, self.check_status)
	[...]


def RUN_PROGRAMM(self):
	self.RUNNING_PROGRAMM=popen2.Popen3(PROGRAMM)
	self.programm_laeuft=1


def check_status(self):
		if self.programm_laeuft==1:
			self.RUN_PROGRAMM_now_status.configure(fg="red")
			if self.RUNNING_PROGRAMM:
				print self.RUNNING_PROGRAMM.poll()
				if self.RUNNING_PROGRAMM.poll()!=-1:
					self.programm_laeuft=0
		else:
			self.RUN_PROGRAMM_now_status.configure(fg="green")
		self.master.after(1000, self.check_status)

[...]
Ich habe also einen "RUN"-Button, auf den ich drücken möchte, dann startet das externe Programm, und meine Oberfläche funktioniert weiterhin. Das Programm muss abgekoppelt werden, da es eine Laufzeit von ca 1h hat. Dann habe ich in meinem GUI das Wort "Staus" stehen, welches rot ist, während das Programm läuft und grün wenn das Programm fertig ist!

Das funktioniert auch alles soweit. Nur das das externe Programm nix tut! Es wird gestartet und läuft dann mit 0% CPU im Sleep-Modus vor sich hin.
An dem externen Programm und den übermittelten Parametern liegts nicht. Wenn ich die check_status Funktion deaktiviere, läuft das externe Programm mit 99% CPU...

Achja, ich arbeite mit Mandrake Linux 9.1; Python 2.2.2.

Ok, Problem ausreichend beschrieben?! Ich wäre dankbar für eine Erklärung, wieso das nicht funktioniert, bzw. wie macht mans "richtig"?

Besten Dank!

Philipp
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Warum erzeugst du einen abhängigen Prozess?

Wenn kein Programmdialog vorhanden ist, bzw. das Programm durch Eingabeumlenkung und / oder Parameter gesteuert wird, versuch es einmal mit dem mit dem Befehl nohup. Dann startest du das Programm, logst dich aus und gehst Bier trinken oder machst was anderes vernünftiges.

Code: Alles auswählen

nohup /usr/bin/deinprog .......... 2>1&
siehe auch man nohup. Alle Bildschirmausgaben landen in der Datei nohup.out. Dadurch vereinfacht sich dann auch dein Pythoncode,

Hans
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Philipp,

schau dir auch mal os.spawn an, das bietet IMHO bessere Möglichkeiten als os.popen

Gruß

Dookie
Antworten