ich habe mir ein Programm mit tkinter erstellt. Dort ist ein Button und so lange wie der Button gedrückt ist, soll ein Ereignis ausgeführt werden.
Um das hinzukriegen, werte ich zwei Ereignisse aus - Maustaste gedrückt und Maustaste losgelassen. Der Status wird in einer Statusvariable gespeichert.
Maustaste gedrückt ruft einen Thread auf, in dem die Schleife läuft. Zuerst hatte ich die Schleife noch in der Funktion, die auf Maustaste gedrückt reagiert. Das Event Maustaste losgelassen reagierte dann nicht mehr drauf - darum habe ich die while-Schleife in einen separaten Thread ausgelagert. Es wird vorher geprüft, ob so ein Thread schon läuft, damit nicht zwei Threads aufgerufen werden koennen.
Ist das so einigermaßen brauchbar gelöst oder gibt es (bessere) Varianten?
Code: Alles auswählen
import tkinter
from time import sleep as Schlafen
from threading import Thread
class State():
def __init__(self):
self._state = False
def set_state(self, state):
self._state = state
def get_state(self):
return self._state
mystate = State()
print (mystate.get_state())
master = tkinter.Tk()
myCanvas = tkinter.Canvas(master)
rect1 = myCanvas.create_rectangle(1,1,100,100, fill="blue")
rect2 = myCanvas.create_rectangle(1,100,100,200, fill="green")
def mouse_button_1_pressed(event):
print ("Mausbutton gedrückt")
if mystate.get_state() == False:
mystate.set_state(True)
t = Thread(target=while_Schleife)
t.start()
def mouse_button_1_released(event):
print ("Mausbutton losgelassen")
mystate.set_state(False)
def while_Schleife():
while mystate.get_state() == True:
print ("Maustaste immer noch gedrückt")
x2=myCanvas.coords(rect1)[2]
myCanvas.coords(rect1, 1,1,x2+3,100)
Schlafen(0.5)
myCanvas.pack()
mybutton = tkinter.Button (master, text="Druecke Taste")
mybutton.bind("<Button-1>", mouse_button_1_pressed)
mybutton.bind("<ButtonRelease-1>", mouse_button_1_released)
mybutton.pack()
master.mainloop()