Seite 1 von 1
GUI reagiert nicht
Verfasst: Donnerstag 23. Februar 2006, 20:41
von apeter
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
Verfasst: Freitag 24. Februar 2006, 00:11
von BlackJack
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?
Verfasst: Freitag 24. Februar 2006, 01:05
von apeter
Ü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()
Verfasst: Freitag 24. Februar 2006, 09:20
von apeter
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
Verfasst: Freitag 24. Februar 2006, 21:51
von apeter
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