Seite 1 von 1

Wie kann ich einen Rechtsklick erkennen?

Verfasst: Samstag 29. Dezember 2007, 20:04
von Nikolas
Für mein Minesweeper müsste ich einen Rechtsklick erkennen.
Kann mir da jemand weiterhelfen?

Verfasst: Samstag 29. Dezember 2007, 20:29
von schlangenbeschwörer

Code: Alles auswählen

import Tkinter as tk
help(tk.Button().bind)
tk.Button().bind("<3>", dosth)
print "reading some docu would be useful"

Verfasst: Samstag 29. Dezember 2007, 20:36
von Nikolas
Sehr nett. Nur hat mir die letzte Doku ein paar Hinweise und Schreibweisen geliefert, die nachher in diesem Forum als eher falsch und unsauber erklärt wurden. :roll:

Und für die Nachwelt, sollte mal jemand die Suche benutzen:

Code: Alles auswählen

button.bind("<Button-1>" , foo2() ) # links
button.bind("<Control Button-1>" , foo1() ) # "rechts" für Leute mit weissen Rechnern 

Verfasst: Sonntag 30. Dezember 2007, 16:43
von Nikolas
Ein Problem habe ich aber noch:

Code: Alles auswählen

but = tk.Button(font=myfont,command = lambda i=i,j=j : self.master.foo(i,j))
                    
                    '''but.bind("<Button-1>",
                        lambda x=j, y=i:self.master.cellKlickedRight(x,y))'''
dieser Code steht in einer GUI-Klasse die in der master-Eigenschaft auf eine andere Klasse zeigt, die die foo-Methode hat:

Code: Alles auswählen

    def foo(self,x,y):
        print self
        print x
        print y
Wenn ich die command-Version benutze, bekomme ich ein
> <__main__.MineApp instance at 0x11bdb20>
> 1
> 3

wobei 1 und 3 stimmt.

in der anderen Version bekomme ich ein

> <__main__.MineApp instance at 0x11bdb48>
> <Tkinter.Event instance at 0x11c92b0>
> 1 (stimmt)

Da die zweite Klasse MineApp heisst, ist das self richtig, nur wird beim bind anstelle des eigentlichen Parameters noch das event mitgeschickt. Leider werde ich aus dem Hilfe-Eintrag nicht schlauer und hoffe mal, dass mir hier jemand weiterhelfen kann.

Verfasst: Sonntag 30. Dezember 2007, 17:18
von schlangenbeschwörer
Natürlich wird ein Eventobjekt mitgeschickt. Es wäre auch umständlich, für jede Taste ein einzelnes Binding zu schreiben. Dann bindest du jeden Tastendruck und guckst dann im Eventhandler im Event nach, welche Taste es war. Oder die Position des Mauszeigers, ect.
Du musst es einfach annehmen, ob du's verwendest oder nicht:

Code: Alles auswählen

def myhandler(self, event, x, y):
    print "das event!" 
ansonsten: effbot hilft

Verfasst: Sonntag 30. Dezember 2007, 22:04
von Nikolas
und wie sieht dann das bind genau aus?
Auch in der Effbot-Doku gibt es kein Beispiel, in dem zusätzliche Werte, sondern nur das event übergeben werden.

Verfasst: Sonntag 30. Dezember 2007, 22:20
von BlackJack
Naja die Funktion bekommt ein zusätzliches erstes Argument, das Event-Objekt, was Du einfach nicht benutzt:

Code: Alles auswählen

button.bind('<Button-1>',
            lambda event, j=j, i=i: self.master.cell_clicked_right(j, i))

Verfasst: Montag 31. Dezember 2007, 14:20
von Nikolas
Aso. Jetzt ist es klar. Ich bin bis jetzt davon ausgegangen, dass in das erste Argument von self.master.klicked,,, das event geschrieben wird, und nicht in das erste Argument vom lambda. :oops:

Danke, jetzt siehts schon wieder etwas besser aus.