我想在tkinter中制作一个简单的游戏,我需要将左/右箭头键绑定到类方法。该方法也接受一个参数。我已完成绑定,但当我单击箭头键时,没有任何动作。我尝试在方法中添加一个print语句,当我单击键时,没有任何内容打印,因此该方法不会被调用。我不认为绑定有效,但我不确定如何修复它!
另外,如果用户持有绑定密钥,是否有办法继续运行绑定方法?就像点击并按住左键并让方法一直反复运行直到用户离开。
感谢。
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()
答案 0 :(得分:2)
抛弃lambdas以获得类函数。而不是
lambda event,arg=.1:self.move(event,arg)
lambda event,arg=-.1:self.move(event,arg))
DO
left
和
right
分别。确保使用event参数编写相应的类函数。
我也不太了解你的代码。在move()
(类World世界方法)中,您设置参数n
,但您从不使用它。尝试稍微清理一下代码,或添加注释来解释你到底在做什么。
答案 1 :(得分: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替换为您的活动。