python 键盘库和tkinter兼容吗?

cnh2zyt3  于 2022-12-10  发布在  Python
关注(0)|答案(2)|浏览(164)

我尝试用键盘上的箭头键来控制变量的值,在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()”是如何工作的,所以也许它只是不是一个好的函数,甚至不是一个正确的库,所以如果你推荐另一个,我会很乐意接受建议。

ifmq2ha2

ifmq2ha21#

在编写tkinter时,你不应该使用keyboard模块。Tkinter为你处理所有键盘事件。
在tkinter中处理键盘事件的方法是创建在按键时调用的函数,然后将该函数绑定到键盘事件。
例如,您可以在程式码中建立如下所示的函数:

def left_arrow(event):
    global xinc
    xinc=xinc-1
    fill_rect(xinc,yinc,10,10,[0,0,0])

然后,您可以将该函数绑定到画布上的<Left>事件以调用该函数:

canvas.bind("<Left>", left_arrow)

您还必须确保为画布提供键盘焦点,因为默认情况下画布不会获得焦点。

canvas.focus_set()

这并不是唯一的解决方案。你也可以将所有的键绑定到同一个函数,然后检查传入的event对象以查看按下了哪个键。你也可以绑定到根窗口或所有窗口(如果你有多个窗口)。
关于tkinter中的事件处理,还有很多东西需要学习,大多数tkinter教程中都有介绍,比如tkdocs.com上的教程。

eagi6jfj

eagi6jfj2#

使用tkinter的内置事件绑定可能会更方便
所以我们不用检查

if is_pressed("left arrow")==True:
    xinc = xinc-1
    fill_rect(xinc, yinc, 10, 10, [0,0,0])

你会写这样的话

def handle_event(event):
    global xinc
    global yinc
    rect_props = (xinc,yinc,10,10,[0,0,0])  # no sense in repeating this...
    if event.keysym == 'Left':
        xinc=xinc-1
        fill_rect(*rect_props)
    elif event.keysym == 'Right':
        xinc=xinc+1
        fill_rect(*rect_props)
    elif event.keysym == 'Up':
        yinc=yinc+1
        fill_rect(*rect_props)
    elif event.keysym == 'Down':
        yinc=yinc-1
        fill_rect(*rect_props)

# bind the keyboard events to your root window
# you could also bind them to the canvas: 'canvas.bind(...)'
tk.bind('<Left>', handle_event)
tk.bind('<Right>', handle_event)
tk.bind('<Up>', handle_event)
tk.bind('<Down>', handle_event)

相关问题