GUI reagiert nicht

Fragen zu Tkinter.
Antworten
apeter
User
Beiträge: 6
Registriert: Donnerstag 23. Februar 2006, 20:25

Donnerstag 23. Februar 2006, 20:41

Hallo zusammen,

hoffe ihr könnt mir weiterhelfen. Wenn ich meine GUI bediene, starten über die Kommandozeile, dann reagiert sie erst wenn ich mein GUI Fenster wieder schließe. Damit meine ich, daß ich die Checkboxen anhacken kann usw aber es erfolgt keine Reaktion darauf. Normal wird mir je nach Auswahl nur ein bestimmter Text auf der Kommandozeile ausgegeben. In meinem Code mache ich zwei Threads auf. In dem einen wird eine Funktion ständig aufgerufen in dem anderen der Status überprüft wobei in diesen Threads der Code für die GUI nicht enthalten ist. Kann es mit dem Threadhandling zusammenhängen?
Ich habe auch noch einen Button erstellt, der mir einen Frame schließen soll, Wenn ich diesen Button drücke, dann funktioniert die GUI wie sie soll. Die Kommandozeile bekommt den Fokus und gibt alles aus was sie soll. Woran könnte es liegen, dass meine GUI nicht von anfang an geht? Hoffe ihr habt Rat, danke schon mal im Voraus.

Gruß Alex
BlackJack

Freitag 24. Februar 2006, 00:11

Ich werde aus Deiner Problembeschreibung nicht so ganz schlau. Was hast Du genau gemacht? Kleinstmöglichstes Quelltextbeispiel, welches Dein(e) Problem(e) zeigt? Wie startest Du das Programm?
apeter
User
Beiträge: 6
Registriert: Donnerstag 23. Februar 2006, 20:25

Freitag 24. Februar 2006, 01:05

Über diese GUI greife ich auf C-Funktionen zu. Wenn ich diese GUI über die cmd starte über:
python
import Modulname
dann kann ich die GUI zwar bedienen, aber es werden keine Ausgaben auf meiner cmd ausgegeben. Erst wenn ich meine GUI schließe, gibt er das aus, was ich in der Checkbox gerade angehackt hatte. Oder wenn ich über einen definierten Button die funktion frame.quit aufrufe (SIEHE HINWEIS IM CODE), nur dann kann ich damit arbeiten so wie gewünscht. Funktionsweise sollte so sein, das ich die checkboxen aktiviere und dann auf der cmd mit print etwas ausgebe.
Hoffe du hast eine Idee woran es liegen könnte. Schonmal danke
Gruß Alex

Code: Alles auswählen

# -*- coding: utf-8 -*-
from Tkinter import *
import string
import os


#Import Packete zur Erzeugung der Komunikation 
import socket
import urllib

#Import Packete zur Erzeugung der Thread-Umgebung
import threading
import time

sem = threading.Semaphore(1)

#Definition der Variablen
zaehler = 0
status_check = 0


def sendVredCmd(cmd):
    cmd = urllib.quote(cmd)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("localhost", 8888))
    s.send("GET ")
    s.send("/python?value=")
    s.send(cmd)
    s.send(" \n\r ")
    s.close()


class PrintTime(threading.Thread):
	def __init__(self,interval):
		threading.Thread.__init__(self) # Required
		self.interval = interval
	
	
	def run(self):
		import BFD
		while 1:
			time.sleep(self.interval)
			sem.acquire()
			BFD.BFD_IMPL_bfd_trigger()
			sem.release()
		
t = PrintTime(0.04) # Create a thread object
t.start() # Start it


class callStatus(threading.Thread):
	def __init__(self,interval):
		threading.Thread.__init__(self) # Required
		self.interval = interval
	
	def run(self):
		import BFD
		global zaehler, status_check
		while 1:
			time.sleep(self.interval)
			print "ok"
			..................
			NUTZEN DER SOCKET SCHNITTSTELLEN

cs = callStatus(0.01) # Create a thread object
cs.start() # Start it

class App:
	
	def __init__(self, master):
			
	
		global DEFINITIONEN

			
		self.mainWindow = Frame()
		self.mainWindow.pack()
		self.mainWindow.master.title("XYZ")
		
		f1 = Frame(root, border=0, relief="raised")
		f1.pack(expand=YES, fill=BOTH)	
		
		label = Label(f1, text="Python Applikation", height=4)
		label.pack()		

DIESEN FRAME WENN ICH MIT frame.quit ZERSTÖRE KLAPPT DIE AUSGABE, EGAL WELCHE CHECKBOXEN ICH AKTIVIERE
		
		frame = Frame(relief=RIDGE, borderwidth=2, border=2)
		frame.pack()
		
		

		f2 = Frame(root, border=0, relief="raised")
		f2.pack(expand=YES, fill=BOTH) 
		
		fCheckb = Frame(f2, relief="raised", border=0)
		fCheckb.grid(column=2,row=3)
		
		self.kl = IntVar()
		self.cc = Checkbutton(fCheckb, variable=self.kl, text="Klemme", command=self.cb)
		self.cc.grid(row=0, column=1, sticky=W)
		label_r = Label(fCheckb, text=Klemme.get(), height=1, fg="red")
		label_r.grid(row=0, column=0, sticky=W)
		
		..............................................
		
		#Neuer Frame mit namen canFrame wird erzeugt
		canFrame = Frame(relief=RIDGE, borderwidth=2)
		canFrame.pack(expand=YES, fill=BOTH)

		
		................................................
		
	def start_app(self):
		STARTEN EINES PROGRAMMS

#Checkbox-Abfrage	

	def cb(self):			
		EINIGE IF's

		
root = Tk()
app = App(root)

root.mainloop()
apeter
User
Beiträge: 6
Registriert: Donnerstag 23. Februar 2006, 20:25

Freitag 24. Februar 2006, 09:20

Hallo zusammen,

habe folgendes herausgefunden. Wenn ich das Prog mit Doppelklick starte, dann funktioniert es ohne Probleme(mit Endung *.py). Nicht aber wenn ich es über die Eingabeaufforderung starte (über >>>python >>>import Modul.Name).Benenne ich es um in *.pyw dann geht es auch nicht. Worin liegt der Unterschied und wie kann ich die Kommandozeile im 1.Fall unterdrücken, die ich bei *.pyw nicht sehe? Hoffe das geht mit *.py auch.

Vielen Dank und Gruß
Alex
apeter
User
Beiträge: 6
Registriert: Donnerstag 23. Februar 2006, 20:25

Freitag 24. Februar 2006, 21:51

Hallo zusammen,

hier die Lösung, falls Interesse.
Die beiden Threads mussten jeweils in ein extra Modul ausgelagert und wieder importiert werden. Dann lief die Sache rund.

Gruß Alex
Antworten