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.
Rechte + Linke Maustaste
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.
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)
Btw: Ich benutze Python2.5, falls dies in irgendeiner Weise relevant seien sollte (ich bezweifle es)...
Die mittlere-Maustaste-Emulation ist bei mir unter Ubuntu auch nicht aktiviert.
Hab mal auf die Schnelle was gebastelt:
yipyip
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()

yipyip
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.
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.
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.
yipyip
@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.

yipyip
Genau das.yipyip hat geschrieben:@numerix nur aus Neugierde:
Wenn linke und rechte Maustaste gleichzeitig gedrueckt und wieder losgelassen werden, erscheint dann die '2' ?
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".