Wie kann ich einen Rechtsklick erkennen?

Fragen zu Tkinter.
Antworten
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

Für mein Minesweeper müsste ich einen Rechtsklick erkennen.
Kann mir da jemand weiterhelfen?
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Code: Alles auswählen

import Tkinter as tk
help(tk.Button().bind)
tk.Button().bind("<3>", dosth)
print "reading some docu would be useful"
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

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 
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

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.
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

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.
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
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))
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

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.
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
Antworten