摆动摆不起作用

时间:2015-04-26 01:25:36

标签: python tkinter

我对这个项目有点麻烦。我必须使用钥匙把手制作一个摆锤,而我上面和下面的钥匙的代码似乎都在起作用。 "向上"假设是使钟摆更快而且'#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()

1 个答案:

答案 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()