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

Samstag 29. Dezember 2007, 20:04

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:

Samstag 29. Dezember 2007, 20:29

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

Samstag 29. Dezember 2007, 20:36

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

Sonntag 30. Dezember 2007, 16:43

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:

Sonntag 30. Dezember 2007, 17:18

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

Sonntag 30. Dezember 2007, 22:04

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

Sonntag 30. Dezember 2007, 22:20

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

Montag 31. Dezember 2007, 14:20

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