Event <Alt_L-Button-1> klappt nicht

Fragen zu Tkinter.
Antworten
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

Hallo,
habe eine kleine Anwendung geschrieben, bei der es möglich sein sollte mit verschiedenen Tasten- und Mausklicks bestimmte Aktionen zu steuern:

- Control + Linke Maustaste -> Objekt verschieben ...
- Alt_L + Linke Maustaste -> Objekt kopieren ...

Leider klappt das nicht - hier mein Code

Code: Alles auswählen

from tkinter import *

class GUI:
    def __init__(self, root):    
        root.title("TEST")
        
        self.txt = StringVar()
        self.widgets(root)
        
        # Alle Varianten liefern eine Fehlermeldung:
        # Varianten <Alt_L-1>, <1-Alt_L>, <Alt_L-Button-1>, ...
        root.bind("<Alt_L-Button-1>", self.callback)
    
    def callback(self, evt):
        evt.multiple = True
        fmt = NL + "{}: {}"
        out = ""
        for k, v in list(vars(evt).items()):
            if k == "widget":
                txt = str(v)
            elif v is None:
                txt = "None"
            elif isinstance(v, (int, float, str, complex)):
                txt = str(v)
            out += fmt.format(k, v)
        self.set(out)

    def widgets(self, root):
        Label(root, textvariable=self.txt).pack()
        self.set()

    def set(self, txt="*********************"):
        self.txt.set(value=txt)
Wie kann man in Tkinter die Aktion Alt-Taste + Maustaste starten?
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Mußt Dir die Events eben zusammensetzen, indem Du den Key abfragst und die Maus extra. Und welche Zeit dazwischen vergangen ist, damit Du weißt, ob das zusammengehört. Hier etwas über keys: http://stackoverflow.com/questions/2721 ... ase-events
und hier auch: http://docstore.mik.ua/orelly/other/pyt ... ect-9.html
und hier: http://infohost.nmt.edu/tcc/help/pubs/t ... names.html

Ich würde sagen, wenn der Maus Klick zwischen KeyPress und KeyRelease liegt, dann gehört es zusammen. Also brauchst Du die Zeit nicht messen.
Bei KeyPress setzt Du ein Flag für en Key, wenn dann der Maus Klick kommt, dann weißt Du es und bei KeyRelease hebst Du das Flag wieder auf. Weitere Mausklicks zählen dann nicht mehr.
Oder Du richtest das Mausklick Event mit dem Keypress ein und hebst es mit KeyRelease wieder auf,
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

Hallo @Alfons Mittelmeyer:
Nach Deinem Vorschlag müsste man aber zwei verschiedene Ereignisse a) Mausklick und b) Tastendruck innerhalb eines Zeitraums auswerten, um die Aktion zu starten. Damit programmiert man sich dann eine Art Erweiterung des Tkinter-Eventmechanismus. Dieser Mechanismus würde es erlauben beliebig aufeinanderfolgende Ereignisse wie ein einziges Ereignis zu behandeln - das wäre eine interessante Aufgabe!

Ich bin eher daran interessiert, ob es **eine** (Ereignis-) Textkombination in Tkinter gibt, die den Event "linke Maustaste und die Alt-Taste werden gleichzeitig gedrückt" beschreibt und mit einem Callback verbinden kann.
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@sedi Stimmt, das könnte man zu so einer Art Erweiterung machen. Da müßtest eben nachdenken, wie man die dann benutzt. Man kann dann für so ein kombiniertes Ereignis mit event_generate einen virtuellen Event erzeugen.

Gut zur gleichen Zeit geschieht das nicht ganz. Zuerst kommt ALT- KeyPress. Wenn dieses Event eintritt, dann macht man ein bind für das Maus Event. Und aut ALT- KeyRelease hebt man das Maus Event wieder auf - oder falls anders gewünscht erst wenn beides geschehen ist: KeyRelease und Mausebutton wieder losgelassen.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@sedi: das übergebene Event hat ein state-Attribut, das die gedrückten Modifier enthält (siehe z.B. hier). Du kannst also bei jedem Mausclick per if unterscheiden ob Alt oder Ctrl gedrückt worden ist.
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

Danke @sirius3, genau nach dem habe ich in etwa gesucht!
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
Antworten