Seite 1 von 1

Rechte + Linke Maustaste

Verfasst: Montag 26. Oktober 2009, 17:21
von randi
Hi,

es tut mir Leid, wenn es bereits ein Thema mit den folgenden Fragen gibt, mit der Suchfunktion hab ich leider kein entsprechendes Thema gefunden:

1. Wie kann ich es mittels Event ermöglichen, dass mein Programm durch Klicken beider Maustasten einen Befehl ausführt? Ich habe es mit [widget.bind("<Button-1-Button-3>", action)] ausprobiert, war leider ein Fehlschlag.

2. Treten Probleme auf, wenn ich bereits Button-1 und Button-3 an ein Event gebunden habe, und ich das Event aus 1. ausführe?

3. Sollte dies komplexer sein, als erwartet, wie könnte ein Beispiel aussehen?

Ich bin für jede Hilfe dankbar.

Re: Rechte + Linke Maustaste

Verfasst: Montag 26. Oktober 2009, 17:42
von numerix
Zumindest auf meinem System ist es so, dass das gleichzeitige Drücken der linken und rechten Maustasten das gleiche Event liefert wie das Drücken der mittleren Maustaste. Eine Bindung an "<Button-2>" wäre dann die Lösung.

Verfasst: Montag 26. Oktober 2009, 20:21
von randi
Schön wär's... :(

Verfasst: Montag 26. Oktober 2009, 20:33
von numerix
randi hat geschrieben:Schön wär's... :(
Dann zeig doch mal den Code.
Bei mir funktioniert das.

Verfasst: Montag 26. Oktober 2009, 20:47
von randi

Code: Alles auswählen

from Tkinter import *

class User_defined:

    def __init__(self,f_x,f_y,mines):
        self.main=Tk()
        self.main.title('MineSweeper')
        self.field=Canvas(self.main,width=(f_x+2)*16,height=(f_y+2)*16)
        #self.field.bind("<Button-1>",self.enter)
        #self.field.bind("<Button-3>",self.mark_mine)
        self.field.bind("<Button-2>",self.special)
        self.field.grid()
        self.main.mainloop()

    def enter(self,event):
        print 1,event.x,event.y

    def mark_mine(self,event):
        print 3,event.x,event.y

    def special(self,event):
        print 13

User_defined(9,9,10)
Hab das jetzt einfach stark vereinfacht, der gesamte Quelltext wäre meiner Meinung nach uninteressant... dennoch kann ich ein gleichzeitiges Drücken der beiden Maustasten nicht an eine Prozedur binden. Wenn ich die Comment-Markierungen entferne, wird dies außerdem als zwei separate Events angesehen, und beide Befehle werden unabhängig voneinander ausgeführt.

Btw: Ich benutze Python2.5, falls dies in irgendeiner Weise relevant seien sollte (ich bezweifle es)...

Verfasst: Montag 26. Oktober 2009, 20:53
von yipyip
Die mittlere-Maustaste-Emulation ist bei mir unter Ubuntu auch nicht aktiviert.
Hab mal auf die Schnelle was gebastelt:

Code: Alles auswählen

import Tkinter as tk

class Gui(object):

  def __init__(self):

    self.root = tk.Tk()
    self.svar = tk.StringVar()
    self.label = tk.Label(self.root, textvariable= self.svar, bg='white',
                          width=18, height=2, font=('Arial', 55, 'bold'))
    self.label.pack()
    self.state = 0
    
    for i in xrange(1, 4):
      for m in ('', 'Double', 'Triple'):
        self.label.bind('<%sButton-%s>' % (('%s-' % m) if m else '', i),
                        lambda ev, m=m, i=i: self.down(m, i))
        self.label.bind('<%sButtonRelease-%s>' % (('%s-' % m) if m else '', i),
                        lambda ev, m=m, i=i: self.up(m, i))
    

  def down(self, mode, num):

    if not self.state: 
      if num in (1, 3):
        self.state = num
    else:
      if num in (x for x in (1, 3) if x != self.state):
        self.svar.set('1 and 3 pressed!')

        
    
  def up(self, mode, num):

    self.state = 0
    self.svar.set('%s %s' % (mode, num)) 

    
  def run(self):

    self.root.mainloop()

####

if __name__ == '__main__':

  Gui().run()
:wink:
yipyip

Verfasst: Montag 26. Oktober 2009, 21:31
von numerix
yipyips Lösung funktioniert bei mir nicht sauber, was aber eigentlich auch klar ist, jedenfalls, wenn die Emulation "1+3=2" verfügbar ist.

An Python 2.5 liegt es nicht, eher am Betriebssystem bzw. dessen Einstellung. Ich verwende Ubuntu 8.10, da funktioniert es mit "Button 2". Vielleicht lässt sich das für dein OS auch so konfigurieren.

Verfasst: Dienstag 27. Oktober 2009, 11:56
von yipyip
Tkinter kann die Ereignisse natuerlich nur so empfangen, wie sie vom OS fuer die Maus konfiguriert sind.
@numerix nur aus Neugierde:
Wenn linke und rechte Maustaste gleichzeitig gedrueckt und wieder losgelassen werden, erscheint dann die '2' ?
Bei mir erscheint erwartungsgemaess '1 and 3 pressed!', wenn beide Tasten gedrueckt sind.

:wink:
yipyip

Verfasst: Dienstag 27. Oktober 2009, 15:07
von numerix
yipyip hat geschrieben:@numerix nur aus Neugierde:
Wenn linke und rechte Maustaste gleichzeitig gedrueckt und wieder losgelassen werden, erscheint dann die '2' ?
Genau das.

Die Variante "1 and 3 pressed" erhalte ich nur, wenn ich linke und rechte Maustaste (leicht) zeitversetzt drücke - aber auch nur, so lange sie gedrückt bleiben. Wenn ich loslasse, bleibt "1" oder "3" stehen, je nachdem, welche der beiden Tasten als letzte losgelassen wird. Bei (scheinbar) gleichzeitigem Loslassen ebenfalls: "1" oder "3".

Verfasst: Dienstag 27. Oktober 2009, 15:10
von yipyip
Danke!
Dann funktioniert es genau so, wie es beabsichtigt war.

:wink:
yipyip

Verfasst: Dienstag 27. Oktober 2009, 17:09
von randi
Also jedes einzelne Detail von yipyip hab ich nicht genau verstanden (bin ja auch nur Schüler), aber ich versteh die Gesamtheit, und ich denke, dass wird mich erstmal weiterbringen.

Ach, und ich benutze Vista-32.