我尝试用键盘上的箭头键来控制变量的值,在tkinter画布上移动一个正方形。我没有错误消息,但是当我运行Python 3.11时,画布弹出了,但是当我按下这些键时没有任何React。我使用
from tkinter import *
from keyboard import *
tk=Tk()
tk.attributes('-fullscreen',True)
canvas=Canvas(tk, width=1366, height=768, background='#fff')
canvas.pack()
colors=[[(255, 255, 255) for i in range(223)] for i in range(321)]
def colr(lis):
a=lis[0]
b=lis[1]
c=lis[2]
if a%256<10:
va='0'+str(a%256)
else:
va=hex(a%256).replace('0x','')
if b%256<10:
vb='0'+str(b%256)
else:
vb=hex(b%256).replace('0x','')
if c%256<10:
vc='0'+str(c%256)
else:
vc=hex(c%256).replace('0x','')
return '#%s'%(va+vb+vc)
def fill_rect(a,b,c,d,e):
a=a+683
b=-b+384
if type(e)==str:
canvas.create_rectangle(a+2,b+2,c+a+2,d+b+2,fill=e,outline='')
else:
canvas.create_rectangle(a+2,b+2,c+a+2,d+b+2,fill=colr(e),outline='')
#Modify the value if the color at pixel x,y
for x in range(c):
for y in range(d):
if (a+x)>=0 and (a+x)<=320 and (b+y)>=0 and (b+y)<=222:
colors[a+x][b+y]=e
xinc=0
yinc=0
fill_rect(xinc,yinc,10,10,[0,0,0])
while True:
if is_pressed("left arrow")==True:
xinc=xinc-1
fill_rect(xinc,yinc,10,10,[0,0,0])
if is_pressed("right arrow")==True:
xinc=xinc+1
fill_rect(xinc,yinc,10,10,[0,0,0])
if is_pressed("up arrow")==True:
yinc=yinc+1
fill_rect(xinc,yinc,10,10,[0,0,0])
if is_pressed("down arrow")==True:
yinc=yinc-1
fill_rect(xinc,yinc,10,10,[0,0,0])
我真的不知道“is_pressed()”是如何工作的,所以也许它只是不是一个好的函数,甚至不是一个正确的库,所以如果你推荐另一个,我会很乐意接受建议。
2条答案
按热度按时间ifmq2ha21#
在编写tkinter时,你不应该使用
keyboard
模块。Tkinter为你处理所有键盘事件。在tkinter中处理键盘事件的方法是创建在按键时调用的函数,然后将该函数绑定到键盘事件。
例如,您可以在程式码中建立如下所示的函数:
然后,您可以将该函数绑定到画布上的
<Left>
事件以调用该函数:您还必须确保为画布提供键盘焦点,因为默认情况下画布不会获得焦点。
这并不是唯一的解决方案。你也可以将所有的键绑定到同一个函数,然后检查传入的
event
对象以查看按下了哪个键。你也可以绑定到根窗口或所有窗口(如果你有多个窗口)。关于tkinter中的事件处理,还有很多东西需要学习,大多数tkinter教程中都有介绍,比如tkdocs.com上的教程。
eagi6jfj2#
使用tkinter的内置事件绑定可能会更方便
所以我们不用检查
你会写这样的话