Probleme mit Threads, GUI, und PyHook

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lordmyder

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

lordmyder hat geschrieben:Kann mir jemand sagen, wie ich das beheben kann?
Tkinter nicht mit Threads kombinieren. Das geht nicht gut.
lordmyder

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

lordmyder hat geschrieben:Ich kenn mich aber nur mit Tkinter einigermaßen aus, und ich brauche Threads.
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:Übrigens hängt das Programm auch, wenn ich den Zugriff auf die GUI über Threads abstelle.
Dann müsstest du mal den Code zeigen. So ins Blaue lässt sich da nichts sagen.
lordmyder

Okay, hier ist ein Auszug.

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()
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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ich habe kein Windows-System, kann den Code also nicht testen und komme darum nicht weiter.
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.
lunar

lordmyder hat geschrieben:Ich kenn mich aber nur mit Tkinter einigermaßen aus, und ich brauche Threads.
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

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?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Evtl. brauchst Du ja pyHook nicht in einem Thread?

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()
Beim Fensterschließen musste ich etwas tricksen, da sonst eine Exception ausgelöst wurde.
MfG
HWK
lordmyder

Danke!
Das ist perfekt, so funktionierts;-)
Antworten