2014-03-26 80 views
0

我想在tkinter中做一個簡單的遊戲,我需要將左/右箭頭鍵綁定到類方法。該方法也接受一個參數。我已經完成了綁定,但是當我點擊箭頭鍵時,沒有任何動作。我試圖給該方法添加一個打印語句,當我點擊這些鍵時,什麼也不打印,所以這個方法沒有被調用。我不認爲綁定正在工作,但我不知道如何解決它!事件綁定箭頭鍵pykin Tkinter

另外,如果用戶持有綁定的密鑰,有沒有辦法繼續運行綁定的方法?就像點擊並按住左鍵並讓方法反覆運行直到用戶放開。

謝謝。

from Tkinter import * 
    from math import * 
    global radius 
    radius=175 
    root=Tk() 
    c=Canvas(root,width=600,height=600) 
    c.pack() 
    c.configure(scrollregion=(-300, -300, 300, 300)) 
    c.create_oval((-40,-40,40,40),fill="Yellow",outline="Yellow") 
    def findcoords(angle,radius): 
      #cos,sin 
      a=cos(radians(angle)) 
      b=sin(radians(angle)) 
      return ((a*radius),(b*radius),(a*radius),(b*radius)) 

    def createOutline(radius): 
     t=0 
     while t<=360: 
      c.create_rectangle(findcoords(t,radius)) 
      t+=.01 
    class World(): 
     def __init__(self,canvas,img=None,size=20,angle=90): 
      self.size=size 
      self.angle=angle 
      self.position=self.findcoord() 
      self.canvas=canvas 
      if img!=None: 
       self.img=img 
       self.current=c.create_image(self.position,image=self.img) 
      else: 
       self.current=c.create_oval(self.position,fill="Blue",outline="Blue") 
      c.bind('<Left>',lambda event,arg=.1:self.move(event,arg)) 
      c.bind('<Right>',lambda event,arg=-.1:self.move(event,arg)) 
     def findcoord(self): 
      #cos,sin 
      a=cos(radians(self.angle)) 
      b=sin(radians(self.angle)) 
      return (((a*radius)-self.size),((b*radius)-self.size),((a*radius)+self.size),((b*radius)+self.size))   
     def move(self,n): 
      self.angle+=.1 
      self.position=self.findcoord() 
      self.canvas.coords(self.current,self.position) 

    createOutline(175) 
    a=World(c) 



    root.mainloop() 

回答

1

嘗試使用設置你的焦點:

c.focus_set() 

你也可以綁定的鑰匙,你的根所以

root.bind('<Left>',lambda event,arg=.1:self.move(event,arg)) 
root.bind('<Right>',lambda event,arg=-.1:self.move(event,arg)) 

它只是看起來像你沒有專注在框架上所以鍵盤按不會被髮送到正確的框架。

只要舉行,你可以讓事件繼續下去,直到鑰匙被釋放。用於釋放密鑰的格式如下所示:

c.bind("<KeyRelease-left>", onkeyrelease_of_key) 

用您的事件替換onkeyrelease_of_key。

2

爲班級職能溝通lambdas。取而代之的

lambda event,arg=.1:self.move(event,arg) 

lambda event,arg=-.1:self.move(event,arg)) 

left 

right 

分別。確保使用event參數編寫相應的類函數。

我也不能完全理解你的代碼。在move()(世界級的方法)中,您設置了參數n,但您從不使用它。嘗試清理一下你的代碼,或者添加註釋來解釋你到底在做什麼。