Info zum Einbinden von gedrücktem Mausbutton

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

Hallo Leute,
gibt es ein
widget.bind('<Linker-Mausbutton-gedrückt-halten>', self.function)?
Den bräuchte ich mal.... :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Noe. Aber es gibt pressed, und es gibt released, und damit kann man sich das doch basteln.
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

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

OH HAT SICH SCHON ERLEDIGT
HAB EINFACH
self.cursor_activate = False
gesetzt :)
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

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

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 :(
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DMD-OS: Beschreib doch mal das eigentliche Problem das Du da lösen willst.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

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 :)
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

`event` hat ein `state`-Attribut, das den aktuellen Maustastendrückzustand enthält.
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

kannst du mir einen tip geben?

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

print(event.state) kommt bei mir ne 8 raus !?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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).
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

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

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

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

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

Was macht das denn anders? Das ist doch immer noch keine Kombination von Enter und gedrueckt halten.
Antworten