Tkinter在OSX上的行为与windows和Linux不同

时间:2016-09-22 13:19:48

标签: python tkinter operating-system keycode

我正在为我正在构建的机器人构建一个简单的输入模块(机器人正在运行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):如果你想知道我打算如何使用这个模块,它会在一个更新方法中运行,并通过勾号调用。这将允许我做自己无法做到的事情。

0 个答案:

没有答案