Hallo,
ich bin gerade dabei ein Programm zu schreiben, dass mir eine GUI (TKinter) anzeigt, Mausaktivitäten ausliest und noch andere Dinge tut.
Ich habe mich dazu entschlossen, in meinem Programm mit Threads zu arbeiten. Und ich weiß, dass ich dabei sicherlich einiges gemacht habe, was man sonst nicht macht=), aber das Programm funktioniert einigermaßen.
Ich habe die GUI im Hauptprogramm laufen. Ändere angezeigte Bilder durch einen Thread (ich weiß, dass sollte man nicht machen).
In einem weiteren Thread lasse ich mir mit PyHook die Mausaktivitäten auswerten.
Jetzt zu meinem Problem: Wenn ich das Programm laufen lasse, funktioniert alles einwandfrei, bis ich mit dem Mauszeiger über die GUI komme, dann fängt die Maus an langsamer zu werden, und nach einer Weile stürzt es ab. Wenn ich die Maus von der GUI fernhalte, läuft das Programm ewig einwandtfrei.
Kann mir jemand sagen, wie ich das beheben kann?
Falls das eine Rolle spielt, ich nutze Win XP und Python 2.5
Gruß,
LordMyder
Probleme mit Threads, GUI, und PyHook
Ich kenn mich aber nur mit Tkinter einigermaßen aus, und ich brauche Threads.
Übrigens hängt das Programm auch, wenn ich den Zugriff auf die GUI über Threads abstelle.
Übrigens hängt das Programm auch, wenn ich den Zugriff auf die GUI über Threads abstelle.
Nicht aus eigener Erfahrung, aber durch Lektüre im Forum habe ich gelernt, dass die Kombination von GUIs mit Threads generell eine schlechte Idee ist, d.h. es ist kein spezielles Problem, das auf Tkinter beschränkt wäre.lordmyder hat geschrieben:Ich kenn mich aber nur mit Tkinter einigermaßen aus, und ich brauche Threads.
Dann müsstest du mal den Code zeigen. So ins Blaue lässt sich da nichts sagen.lordmyder hat geschrieben:Übrigens hängt das Programm auch, wenn ich den Zugriff auf die GUI über Threads abstelle.
Okay, hier ist ein Auszug.
So, dass ist ein kleiner Auszug aus meinem Code.
Ich habe nur das drin gelassen, was für den Fehler relevant ist.
Ich hoffe ihr könnt mir helfen.
Gruß,
LordMyder
Code: Alles auswählen
import thread
from Tkinter import Tk, Button, Label, PhotoImage
import pythoncom, pyHook
class berechnungen:
def __init__(self):
thread.start_new_thread(self.abfrage_starten,())
def abfrage_starten(self):
#starten des abfangens der Maus/Keyboard Aktivitäten
hm = pyHook.HookManager()
hm.MouseAll = self.OnEvent
hm.HookMouse()
pythoncom.PumpMessages()
def OnEvent(self,event):
print event.Time
#Grafik
root=Tk()
lab=Label(root)
lab.pack()
calc=berechnungen()
root.mainloop()
Ich habe nur das drin gelassen, was für den Fehler relevant ist.
Ich hoffe ihr könnt mir helfen.
Gruß,
LordMyder
Keine Idee woran so etwas liegen kann?
Da muss ja irgendwas grundlegendes falsch laufen wenn er sich aufhängt, wenn die Maus über der GUI ist.
Da muss ja irgendwas grundlegendes falsch laufen wenn er sich aufhängt, wenn die Maus über der GUI ist.
Die Tatsache, dass du Threads brauchst, ändert aber nichts an der Tatsache, dass paralleler Zugriff von mehreren Threads auf ein GUI-Modul selten gut geht. Tkinter ist eben nicht threadsafe, du solltest das Toolkit wechseln.lordmyder hat geschrieben:Ich kenn mich aber nur mit Tkinter einigermaßen aus, und ich brauche Threads.
Ich weiß ja, dass man das nicht umbedingt machen sollte.
Aber die GUI hat doch jetzt eigentlich nichts mit einem Thread zu tun.
Ich habe das Programm jetzt soweit zurück gebaut, dass ich nur noch eine Klasse habe, in der pyHook in einem Thread gestartet wird.
Und das bereits, funktioniert nicht.
Also scheint pyHook mit threads ein Problem zu haben, aber ich weiß nicht was ich dagegen tun kann.
Wenn ich pyHook aufrufe macht das ja seine eigene Schleife, und ich komme ich Code nicht voran. Also muss ich es (meiner Meinung nach) in einen Thread setzen, damit das Programm weiterlaufen kann.
Sehe ich da was falsch, oder weiß jemand wie ich mein Problem beheben kann?
Aber die GUI hat doch jetzt eigentlich nichts mit einem Thread zu tun.
Ich habe das Programm jetzt soweit zurück gebaut, dass ich nur noch eine Klasse habe, in der pyHook in einem Thread gestartet wird.
Und das bereits, funktioniert nicht.
Also scheint pyHook mit threads ein Problem zu haben, aber ich weiß nicht was ich dagegen tun kann.
Wenn ich pyHook aufrufe macht das ja seine eigene Schleife, und ich komme ich Code nicht voran. Also muss ich es (meiner Meinung nach) in einen Thread setzen, damit das Programm weiterlaufen kann.
Sehe ich da was falsch, oder weiß jemand wie ich mein Problem beheben kann?
Evtl. brauchst Du ja pyHook nicht in einem Thread?Beim Fensterschließen musste ich etwas tricksen, da sonst eine Exception ausgelöst wurde.
MfG
HWK
Code: Alles auswählen
import pyHook, sys, Tkinter
def on_event(event):
print event.Time
def finish():
sys.exit()
hm = pyHook.HookManager()
hm.MouseAll = on_event
hm.HookMouse()
root = Tkinter.Tk()
root.protocol('WM_DELETE_WINDOW', finish)
root.mainloop()
MfG
HWK