Info zum Einbinden von gedrücktem Mausbutton

Fragen zu Tkinter.
Sirius3
User
Beiträge: 11566
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 26. März 2020, 11:27

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

Donnerstag 26. März 2020, 12:36

das *merken* habe ich im "richtigen" programm schon drin.
hätte es aber lieber "schöner"...
trotzdem danke
__deets__
User
Beiträge: 7656
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 26. März 2020, 12:50

Dann schreib's dir doch schoener. Es hindert dich doch niemand, die entsprechenden Abstraktionen selbst zu basteln.
DMD-OS
User
Beiträge: 148
Registriert: Freitag 28. Dezember 2018, 13:52

Donnerstag 26. März 2020, 14:00

<B1-Motion> HABE ICH GESUCHT, ICH ARSCH.
Genau das wollte ich :)
SORRY und thx nochma :) :) :)
__deets__
User
Beiträge: 7656
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 26. März 2020, 14:01

Was macht das denn anders? Das ist doch immer noch keine Kombination von Enter und gedrueckt halten.
DMD-OS
User
Beiträge: 148
Registriert: Freitag 28. Dezember 2018, 13:52

Freitag 27. März 2020, 11:29

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: 148
Registriert: Freitag 28. Dezember 2018, 13:52

Freitag 27. März 2020, 11:42

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