Python TKinter:按下键时移动,不按下时停止

Python TKinter:按下键时移动,不按下时停止,python,canvas,tkinter,tkinter-canvas,Python,Canvas,Tkinter,Tkinter Canvas,我试图用我的球创造一个“更平滑”的运动。基本上,我想让我的程序检测何时按下一个键,并让它以恒定的速度移动球,当没有按下键时,让它停止 这是我的代码: import time import Tkinter import math root = Tkinter.Tk() r = 10 x = 150 y = 150 canvas = Tkinter.Canvas(root, width=600, height=600, background='#FFFFFF') canvas.grid(row

我试图用我的球创造一个“更平滑”的运动。基本上,我想让我的程序检测何时按下一个键,并让它以恒定的速度移动球,当没有按下键时,让它停止

这是我的代码:

import time
import Tkinter
import math

root = Tkinter.Tk()

r = 10
x = 150
y = 150

canvas = Tkinter.Canvas(root, width=600, height=600, background='#FFFFFF')
canvas.grid(row=0, rowspan=2, column=1)

circle_item = canvas.create_oval(x - r, y - r, x + r, y + r,
                                 outline='#000000', fill='#00FFFF')
global leftInt
leftInt = 0


def leftMove(Event):
    global leftInt
    leftInt = 1
    gogo = 1
    if (gogo == 1):
        ballMove()
        gogo = 2


def leftStop(Event):
    global leftInt
    leftInt = 0
    print("im stop")


def rightMove(Event):
    canvas.move(circle_item, 5, 0)
    x1, y1, x2, y2 = canvas.coords(circle_item)


def upMove(Event):
    canvas.move(circle_item, 0, -5)
    x1, y1, x2, y2 = canvas.coords(circle_item)


def downMove(Event):
    canvas.move(circle_item, 0, 5)
    x1, y1, x2, y2 = canvas.coords(circle_item)


def ballMove():
    global leftInt
    while (leftInt == 1):
        print('im go')
        canvas.move(circle_item, -5, 0)
        x1, y1, x2, y2 = canvas.coords(circle_item)
        time.sleep(.1)


ballMove()

root.bind('<Left>', leftMove)
root.bind('<KeyRelease>', leftStop)
root.bind('<Right>', rightMove)
root.bind('<Up>', upMove)
root.bind('<Down>', downMove)

root.mainloop()
导入时间
进口Tkinter
输入数学
root=Tkinter.Tk()
r=10
x=150
y=150
canvas=Tkinter.canvas(根,宽=600,高=600,背景='#FFFFFF')
canvas.grid(行=0,行跨度=2,列=1)
圆圈=画布。创建椭圆(x-r,y-r,x+r,y+r,
大纲='000000',填充='00FFFF')
全局左撇子
leftInt=0
def leftMove(事件):
全局左撇子
leftInt=1
gogo=1
如果(gogo==1):
鲍尔莫夫()
gogo=2
def leftStop(事件):
全局左撇子
leftInt=0
打印(“即时停止”)
def rightMove(事件):
canvas.move(圈_项,5,0)
x1,y1,x2,y2=画布坐标(圆圈项目)
def上移(事件):
canvas.move(圈_项,0,-5)
x1,y1,x2,y2=画布坐标(圆圈项目)
def下移(事件):
canvas.move(圈_项,0,5)
x1,y1,x2,y2=画布坐标(圆圈项目)
def ballMove():
全局左撇子
而(leftInt==1):
打印('im go')
canvas.move(圈出项目-5,0)
x1,y1,x2,y2=画布坐标(圆圈项目)
时间。睡眠(.1)
鲍尔莫夫()
root.bind(“”,leftMove)
root.bind(“”,leftStop)
root.bind(“”,rightMove)
root.bind(“”,向上移动)
root.bind(“”,下移)
root.mainloop()

我试图在按下时创建一个while循环,然后让按键释放停止它。为什么不停下来?如何解决这一问题?

请注意,操作系统的重复率以及它如何处理按下的键决定了发生的情况,因此,即使您连续按住键,也可能同时看到“im go”和“im stop”。将ballMove()更改为使用Tkinter的after方法。您不应该在GUI程序中使用time.sleep(),因为它可能会中断GUI的无限循环

def ballMove():
    global leftInt
    if (leftInt == 1):
        x1, y1, x2, y2 = canvas.coords(circle_item)
        print('im go', x1)
        if x1 > 3:        ## keep it on the canvas
            canvas.move(circle_item, -5, 0)
            root.after(100, ballMove)

有没有办法禁用操作系统处理密钥的方式?比如,我可以在我的程序中禁用它或者解决它吗?