Rechte + Linke Maustaste

Fragen zu Tkinter.
Antworten
randi
User
Beiträge: 4
Registriert: Montag 26. Oktober 2009, 17:09

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
randi
User
Beiträge: 4
Registriert: Montag 26. Oktober 2009, 17:09

Schön wär's... :(
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

randi hat geschrieben:Schön wär's... :(
Dann zeig doch mal den Code.
Bei mir funktioniert das.
randi
User
Beiträge: 4
Registriert: Montag 26. Oktober 2009, 17:09

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)...
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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".
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Danke!
Dann funktioniert es genau so, wie es beabsichtigt war.

:wink:
yipyip
randi
User
Beiträge: 4
Registriert: Montag 26. Oktober 2009, 17:09

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.
Antworten