我正在为我正在构建的机器人构建一个简单的输入模块(机器人正在运行pi,因此它将在Linux中毁掉)。我开始研究Windows笔记本电脑上的代码,当我回到家时,我把它带到我的Mac上,因为它有一个更大的屏幕可供使用。当我这样做时,我注意到Tkinter的行为有所不同。
对于初学者,它会返回不同的键码。在Windows上,输入的密钥代码是13,但它在mac上返回为2359309
在Windows计算机上,当我按下一个键时,我的外壳将打印按键键代码并且不会打印键释放直到我释放键 然而,在Mac上,如果我按住键,它会一直反复按键键码一遍又一遍地释放键码,即使我没有释放键。
我有办法解决这个问题吗?
这是我的模块代码
from tkinter import *
dictOfKeyButtons = dict()
history = []
class ButtonsKey(object):
def __init__(self, name):
self.name = name
self.isDown = False
self.isUp = True
def Pressed(self):
self.isDown = True
self.isUp = False
print("Key pressed: ", self.name)
def Released(self):
self.isDown = True
self.isUp = False
print("Key released: ", self.name)
def checkForKey(theKeyCode):
if not theKeyCode in dictOfKeyButtons:
dictOfKeyButtons[theKeyCode] = ButtonsKey(theKeyCode)
def getKeyDown(theKeyCode):
checkForKey(theKeyCode)
isDown = dictOfKeyButtons[theKeyCode].isDown
return isDown
def getKeyUp(theKeyCode):
checkForKey(theKeyCode)
isUp = dictOfKeyButtons[theKeyCode].isUp
return isUp
def keyup(e):
checkForKey(e.keycode)
if e.keycode in history :
history.pop(history.index(e.keycode))
var.set(str(history))
dictOfKeyButtons[e.keycode].Released()
def keydown(e):
checkForKey(e.keycode)
if not e.keycode in history :
history.append(e.keycode)
var.set(str(history))
print("i")
dictOfKeyButtons[e.keycode].Pressed()
else:
#may do something with holding key down here
pass
root = Tk()
var = StringVar()
a_label = Label(root,textvariable = var ).pack()
frame = Frame(root, width=200, height=200)
frame.bind("<KeyPress>", keydown)
frame.bind("<KeyRelease>", keyup)
frame.pack()
frame.focus_set()
root.mainloop()
我将使用input.getKeyDown(keycode):如果你想知道我打算如何使用这个模块,它会在一个更新方法中运行,并通过勾号调用。这将允许我做自己无法做到的事情。