@DMD-OS: wenn Dein Event jetzt nur auf Linke-Button-Drücke hört, dann ist das kein Wunder, dass nur wenn Du einen Linken Button drückst, eine Ausgabe mit state 8 kommt.
Aber ich habe Dich so verstanden, dass Du im <ENTER>-Event abfragen willst, ob ein Mausknopf gedrückt wurde, und da hat state schon verschiedene Werte.
In Deinem verlinkten Link geht das mit Tastendrücken. Wer schreibt, dass das mit jeder Event-Kombination geht? Tk sagt jedenfalls, dass Deine Kombination nicht geht. Wer von beiden hat wohl recht?
Info zum Einbinden von gedrücktem Mausbutton
hallo
ich habe da jetzt nochmal etwas weiterversucht. nachdem ich etwas im netz gefunden habe, habe ich es meinen zwecken angepasst:
https://stackoverflow.com/questions/328 ... -held-down
jetzt bräuchte ich nochma hilfe/tipps.
leider gibt es ein problem mit dem self.after_id befehl --> wenn man die maus zu schnell bewegt, kommt es zu einer ausnahme: _tkinter.TclError: unknown option "-text".
ich versuche jetzt, das self.after_id = self.btn_frame.after(100, self.poll) irgendwie durch label.bind("<Enter>") zu ersetzen, damit die ausgabe nur dann passiert,
wenn die Maus über ein neues label bewegt wird.
Das funktioniert natürlich nicht, da label.bind("<ButtonPress-1>" die funktion label.bind("<Enter>") ausschaltet.
Hat da jemand vielleicht eine bessere idee?
ich habe da jetzt nochmal etwas weiterversucht. nachdem ich etwas im netz gefunden habe, habe ich es meinen zwecken angepasst:
https://stackoverflow.com/questions/328 ... -held-down
Code: Alles auswählen
import tkinter
class App:
def __init__(self, parent):
self.root = parent
self.mouse_pressed = False
self.btn_frame = tkinter.Frame(width=100, height=100, background="bisque")
self.btn_frame.pack(padx=20, pady=20)
self.after_id = None
for row in range(10):
for column in range(5):
text = str(column) + '.' + str(row)
label = tkinter.Label(self.btn_frame, text=text, width=10, relief=tkinter.GROOVE)
label.grid(row=row, column=column, sticky=tkinter.NSEW)
label.bind("<ButtonPress-1>", self.OnMouseDown)
label.bind("<ButtonRelease-1>", self.OnMouseUp)
def do_work(self):
x = self.btn_frame.winfo_pointerx()
y = self.btn_frame.winfo_pointery()
out = self.btn_frame.winfo_containing(x, y)
print(x, y, out.cget('text'))
def OnMouseDown(self, _):
self.mouse_pressed = True
self.poll()
def OnMouseUp(self, _):
self.btn_frame.after_cancel(self.after_id)
def poll(self):
if self.mouse_pressed:
self.do_work()
self.after_id = self.btn_frame.after(100, self.poll)
root = tkinter.Tk()
app = App(root)
root.mainloop()
leider gibt es ein problem mit dem self.after_id befehl --> wenn man die maus zu schnell bewegt, kommt es zu einer ausnahme: _tkinter.TclError: unknown option "-text".
ich versuche jetzt, das self.after_id = self.btn_frame.after(100, self.poll) irgendwie durch label.bind("<Enter>") zu ersetzen, damit die ausgabe nur dann passiert,
wenn die Maus über ein neues label bewegt wird.
Das funktioniert natürlich nicht, da label.bind("<ButtonPress-1>" die funktion label.bind("<Enter>") ausschaltet.
Hat da jemand vielleicht eine bessere idee?
ICH HABS!
einfach die zeile:
durch
ersetzen und die zeilen:
entfernen.
einfach die zeile:
Code: Alles auswählen
label.bind("<ButtonPress-1>", self.OnMouseDown)
Code: Alles auswählen
label.bind("<B1-Motion>", self.OnMouseDown)
Code: Alles auswählen
def OnMouseUp(self, _):
self.btn_frame.after_cancel(self.after_id)
self.after_id = self.btn_frame.after(100, self.poll)
label.bind("<ButtonRelease-1>", self.OnMouseUp)