【发布时间】:2016-04-23 19:05:39
【问题描述】:
我有一个使用 Tkinter 的 Python 3.4.4 程序,它应该在屏幕上移动一个正方形。
不幸的是,canvas.bind 在 while 循环内似乎不起作用,但它必须在 while 循环内,否则方块不会移动。这是因为我在每次循环运行时在技术上绘制一个具有不同 x、y、x1 和 y1 坐标的新正方形,并且绑定是使正方形根据箭头键在每个方向上移动的原因。
代码如下:
from tkinter import *
import time, random
tk = Tk()
canvas = Canvas(tk, width = 1000, height = 1000)
canvas.pack()
def move(event):
if event.keysym == 'Up':
y-=10
y1-=10
elif event.keysym == 'Down':
y+=10
y1+=10
elif event.keysym == 'Right':
x+=10
x1+=10
elif event.keysym == 'Left':
x+=10
x1+=10
background = canvas.create_rectangle(0, 0, 1000, 1000, fill = 'orange') #draws background
ranNum=random.random()*960 #Creates a random number
ranNum1=random.random()*960 #Creates a random number
food = canvas.create_rectangle(ranNum, ranNum1, ranNum + 15, ranNum1 + 15, fill='green') #creates food
r1 = None
o = 0
length = 4
x = 500
y = 500
x1 = 515
y1 = 515
while o < length:
if canvas.find_overlapping(ranNum, ranNum, ranNum + 15, ranNum1 + 15) == True:
x+=5
y+=5
x1+=5
y1+=5
canvas.delete(food)
r=canvas.create_rectangle(x, y, x1, y1, fill = 'blue')
canvas.bind('<KeyPress-Up>', move )
canvas.bind('<KeyPress-Down>', move)
canvas.bind('<KeyPress-Left>', move)
canvas.bind('<KeyPress-Right>', move)
time.sleep(.0)
canvas.delete(r1)
tk.update()
r1 = r
【问题讨论】:
-
不需要在每一步都更新画布元素或 Tk()。为什么要将事件绑定到画布?绑定到 main_Tk(mean window),如果鼠标悬停在画布上,则监听每个键。
-
所以删除 tk.update 而不是 canvas.bind 使用 main_tk.bind?
-
是的,也许你稍后会删除画布或画布元素!
-
main_Tk 只是提出了一个语法错误,说 NameError: name 'main_tk' is not defined
-
对不起!
main_tk是tk而你的tk.mainloop()行在哪里?
标签: python tkinter key-bindings tkinter-canvas