Seite 1 von 2

Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Mittwoch 25. März 2020, 13:16
von DMD-OS
Hallo Leute,
gibt es ein
widget.bind('<Linker-Mausbutton-gedrückt-halten>', self.function)?
Den bräuchte ich mal.... :)

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Mittwoch 25. März 2020, 13:31
von __deets__
Noe. Aber es gibt pressed, und es gibt released, und damit kann man sich das doch basteln.

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Mittwoch 25. März 2020, 16:08
von DMD-OS
Danke.
Noch ne Frage :)
Ich benutze

Code: Alles auswählen

    def _unbound_to_mousewheel(self, _):
        self.canvas.unbind_all("<MouseWheel>")
um das Scrollrad beim Verlassen zu lösen.
Ich würde aber auch noch zusätzlich den cursor wieder von

Code: Alles auswählen

widget.configure(cursor='hand2')
auf

Code: Alles auswählen

widget.configure(cursor='')
setzen.
D.h. beim Übertreten des Canvas soll die Scrollbar gekickt werden (wird es ja schon) und zusätzlich
der Cursor wieder auf "Normaler Pfeil" gesetzt werden,.
Kann man das dort direkt ansprechen?

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Mittwoch 25. März 2020, 16:09
von DMD-OS
OH HAT SICH SCHON ERLEDIGT
HAB EINFACH
self.cursor_activate = False
gesetzt :)

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 08:29
von DMD-OS
Ok, vielleicht falsch formuliert.
Gibt es ein widget.bind, das <Enter> und <ButtonPress-1> vereint?
ich möchte gern mit gedrückter linker maus die funktion für enter nutzen.
sobald ich loslasse, stoppen.

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 09:01
von DMD-OS
Habe hier mal ein kleines Beispiel.
Die schlechte Wahl einer globalen Variable ist mir bekannt. Später wird die durch self.press_activate ersetzt.
Um es kleiner und einfacher zu gestalten:

Code: Alles auswählen

import tkinter as tk

root = tk.Tk()


press_activate = False


def pressed(event):
    global press_activate
    press_activate = True


def released(event):
    global press_activate
    press_activate = False


def enter(event):
    print(press_activate)
    # while press_activate is True:
    #     widget = event.widget.grid_info()
    #     column, row = widget['column'], widget['row']
    #     print(column, row)


for col in range(5):
    for row in range(10):
        lb = tk.Label(root, text="Label"+str(col)+str(row), width=10, relief=tk.GROOVE)
        lb.grid(row=row, column=col, sticky=tk.NSEW)
        lb.bind("<ButtonPress-1>", pressed)
        lb.bind("<ButtonRelease-1>", released)
        lb.bind("<Enter>", enter)

root.mainloop()
Ich versuche es hinzubekommen, die print-ausgabe nur ausführen zu lassen, wenn die linke Maustaste gedrückt gehalten wird.
ES IST ALLES SO DUNKEL :(

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 09:02
von __blackjack__
@DMD-OS: Beschreib doch mal das eigentliche Problem das Du da lösen willst.

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 09:41
von DMD-OS
ich möchte nur mit gedrücktem linken mausebutton das <Enter>-binding ausgeben.
ungefähr so:

Code: Alles auswählen

import tkinter as tk

root = tk.Tk()


def pressed(event):
    print('pressed')
    # widget = event.widget.grid_info()
    # column, row = widget['column'], widget['row']
    # print(column, row)


for col in range(5):
    for row in range(10):
        lb = tk.Label(root, text="Label"+str(col)+str(row), width=10, relief=tk.GROOVE)
        lb.grid(row=row, column=col, sticky=tk.NSEW)
        lb.bind("<Enter> <ButtonPressed-1>", pressed)

root.mainloop()
also wenn ich nur <Enter> benutze, werden beim drüberfahren die einzelnen label ausgegeben. (Kein Problem)
das soll aber nur mit gedrückt gehaltenem linken mausbutton funktionieren.
hoffe, das ist jetzt klar verständlich :)

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 09:48
von Sirius3
`event` hat ein `state`-Attribut, das den aktuellen Maustastendrückzustand enthält.

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 10:02
von DMD-OS
kannst du mir einen tip geben?

widget = event.state('Mouse') funktioniert nicht

print(event.state) kommt bei mir ne 8 raus !?

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 10:38
von __deets__
Ist es eine andere Zahl, wenn NICHT der entsprechende Button gedrueckt ist? Und nochmal eine andere, wenn *zwei* gedrueckt sind? Dann sind das Bit-Flags, die kombiniert werden.

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 10:45
von DMD-OS
ich bekomme nur immer ne 8 wenn ich den linken mousebutton drücke.

Code: Alles auswählen

import tkinter as tk

root = tk.Tk()


def pressed(event):
    widget = event.widget.grid_info()
    column, row = widget['column'], widget['row']
    print(column, row, 'Event-State:', event.state)


for col in range(5):
    for row in range(10):
        lb = tk.Label(root, text="Label"+str(col)+str(row), width=10, relief=tk.GROOVE)
        lb.grid(row=row, column=col, sticky=tk.NSEW)
        lb.bind("<Enter> <ButtonPress-1>", pressed)

root.mainloop()
Sieht nicht so aus, als wenn <Enter> <ButtonPress-1> überhaupt miteinander kombiniert wurden.

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 10:50
von __deets__
Und was bekommst du, wenn du den RECHTEN Button drueckst? Und das sich das nicht gemeinsam binden laesst ist nicht verwunderlich, steht das irgendwo, dass es ginge?

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 11:11
von DMD-OS
Wenn ich den rechten Button gedrückt halte, passiert nichts.
Nur wenn ich den linken Button drück, gibt es eine ausgabe: 2 4 Event-State: 8, 1 3 Event-State: 8, 2 2 Event-State: 8, ....
ansonsten passiert nichts. <Enter> ist ausgeschaltet, obwohl es hier so beschieben wird:
https://stackoverflow.com/questions/411 ... -in-python

ich benutze python 3.7.
frage mich grad, warum es keinen bind für "gedrückt-gehaltener-linker-Mousbutton" gibt?
es gibt ja sonst alle.

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 11:19
von __deets__
Weil das kein Event ist. Wenn ein Button gedrueckt wird, ist das ein Event. Wenn ein Button losgelassen wird, ist das ein Event. Das zwischendurch nichts passiert ist, ist halt kein Ereignis. Und du kannst dir doch einfach *merken*, dass ein Button gedrueckt wurde, und wenn er losgelassen wird, diesen Zustand wieder zurueck setzen. Oder eben diesen state benutzen (den ich nicht dokumentiert gefunden habe, darum kann ich da wenig zu sagen).

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 11:27
von Sirius3
@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?

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 12:36
von DMD-OS
das *merken* habe ich im "richtigen" programm schon drin.
hätte es aber lieber "schöner"...
trotzdem danke

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 12:50
von __deets__
Dann schreib's dir doch schoener. Es hindert dich doch niemand, die entsprechenden Abstraktionen selbst zu basteln.

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 14:00
von DMD-OS
<B1-Motion> HABE ICH GESUCHT, ICH ARSCH.
Genau das wollte ich :)
SORRY und thx nochma :) :) :)

Re: Info zum Einbinden von gedrücktem Mausbutton

Verfasst: Donnerstag 26. März 2020, 14:01
von __deets__
Was macht das denn anders? Das ist doch immer noch keine Kombination von Enter und gedrueckt halten.