Info zum Einbinden von gedrücktem Mausbutton

Fragen zu Tkinter.
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

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

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()
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?
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

ICH HABS!
einfach die zeile:

Code: Alles auswählen

label.bind("<ButtonPress-1>", self.OnMouseDown)
durch

Code: Alles auswählen

label.bind("<B1-Motion>", self.OnMouseDown)
ersetzen und die zeilen:

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)
entfernen.
Antworten