我对这个项目有点麻烦。我必须使用钥匙把手制作一个摆锤,而我上面和下面的钥匙的代码似乎都在起作用。 "向上"假设是使钟摆更快而且'#34;向下"让它变得更慢。这是我到目前为止的代码。有人可以帮忙。
from tkinter import * # Import tkinter
import math
width = 200
height = 200
pendulumRadius = 150
ballRadius = 10
leftAngle = 120
rightAngle = 60
class MainGUI:
def __init__(self):
self.window = Tk() # Create a window, we may call it root, parent, etc
self.window.title("Pendulum") # Set a title
self.canvas = Canvas(self.window, bg = "white",
width = width, height = height)
self.canvas.pack()
self.angle = leftAngle # Start from leftAngle
self.angleDelta = -1 # Swing interval
self.delay = 200
self.window.bind("<Key>",self.key)
self.displayPendulum()
self.done = False
while not self.done:
self.canvas.delete("pendulum") # we used delete(ALL) in previous lab
# here we only delete pendulum object
# in displayPendulum we give the tag
# to the ovals and line (pendulum)
self.displayPendulum() # redraw
self.canvas.after(self.delay) # Sleep for 100 milliseconds
self.canvas.update() # Update canvas
self.window.mainloop() # Create an event loop
def displayPendulum(self):
x1 = width // 2;
y1 = 20;
if self.angle < rightAngle:
self.angleDelta = 1 # Swing to the left
elif self.angle > leftAngle:
self.angleDelta = -1 # Swing to the right
self.angle += self.angleDelta
x = x1 + pendulumRadius * math.cos(math.radians(self.angle))
y = y1 + pendulumRadius * math.sin(math.radians(self.angle))
self.canvas.create_line(x1, y1, x, y, fill="blue", tags = "pendulum")
self.canvas.create_oval(x1 - 2, y1 - 2, x1 + 2, y1 + 2,
fill = "red", tags = "pendulum")
self.canvas.create_oval(x - ballRadius, y - ballRadius,
x + ballRadius, y + ballRadius,
fill = "green", tags = "pendulum")
def key(self,event):
print(event.keysym)
print(self.delay)
if event.keysym == 'up':
print("up arrow key pressed, delay is",self.delay)
if self.delay >10:
self.delay -= 1
if event.keysym == 'Down':
print("Down arrow key pressed,delay is",self.delay)
if self.delay < 200:
self.delay += 1
if event.keysym=='q':
print ("press q")
self.done = True
self.window.destroy()
MainGUI()
答案 0 :(得分:0)
问题的根源是事件keysym是"Up"
,但是你将它与全小写的“up”进行比较。当然,每次比较都失败了。将if语句更改为if event.keysym == 'Up':
改善动画
如果您感兴趣,在tkinter中制作动画的方法比编写自己的无限循环更好。 Tkinter已经有一个无限循环运行(mainloop),所以你可以利用它。
创建一个绘制一个帧的函数,然后让该函数安排自己在将来的某个时刻再次调用。具体来说,只需拨打displayFrame()
一次,就可以移除整个“while”循环,然后像这样定义displayFrame
:
def drawFrame(self):
if not self.done:
self.canvas.delete("pendulum")
self.displayPendulum()
self.canvas.after(self.delay, self.drawFrame)
改善绑定
一般来说,如果您对特定密钥具有特定绑定,则您的代码将更容易管理和测试。因此,您可以为每个键设置特定的功能,而不是单个catch-all功能。
由于您的应用支持向上键,向下键和“q”键,我建议使用三种绑定:
self.window.bind('<Up>', self.onUp)
self.window.bind('<Down>', self.onDown)
self.window.bind('<q>', self.quit)
然后,您可以定义每个函数以完成一件事:
def onUp(self, event):
if self.delay > 10:
self.delay -= 1
def onDown(self, event):
if self.delay < 200:
self.delay += 1
def onQuit(self, event):
self.done = True
self.window.destroy()