簡體   English   中英

Python:我該如何編寫鍵盤事件?

[英]Python: how would I write a keyevent?

簡而言之,我希望我的代碼每次按下一個鍵時都調用一個事件,例如OnKeyPress(“ Keyname”)之類的東西。 我不想使用tkinter。

我有一個Update方法,它在父類中每秒被調用20次,而我有幾個子類都具有該函數。 我想在其中的一些按鈕上使用按鍵事件來使我正在移動的機器人零件運動(例如:當我按下向上箭頭時,機器人將移動前言)tkinter並不是為此而設計的,它的更多功能是在屏幕上繪制內容,我想使代碼更高效。 我也想擁有自己的,然后使用預制的,這樣我才能更好地了解它的工作原理。

我敦促您重新考慮不使用tkinter。 忽略GUI內容,它具有經過測試的跨平台異步事件循環系統,該系統可以處理計划(定時)事件以及按鍵和釋放事件。 並且它是用C編寫的,並隨着平台的變化而更新。 (請參閱有關平台更改的配方@Ty的注釋。)您將發現很難在Python中重現相同的功能。

使用將以

import tkinter
root = tkinter.Tk()
root.withdraw()  # make the window invisible

此后,可以忽略GUI內容,而僅使用root.bind(鍵事件,函數)和root.after(毫秒,函數,* args)。 (與此同時,將來仍然可以使用圖形與機器人進行交互。)

給定現有的move_forward和stop_move函數,以下是在按向上箭頭的同時使機器人移動的方法。

root.bind('<KeyPress-Up>', move_forward)
root.bind('<keyRelease-Up>' stop_move)

關於異步(非阻塞)的重要性:我假設您通過在每次更新之間調用time.sleep(.05)每秒調用一次更新函數20次。 這是一個阻塞調用,在此期間您的代碼被凍結。 它不能做任何事情,也不能響應事件。

假設您為機器人開發了兩個或更多動畫:說一個代表手臂,一個代表頭部(或任何適合您的機器人的動畫)。 每個命令都由一系列時間命令組成,這些命令由root.after調用實現。 現在假設您要並行運行兩個或更多動畫。 假設每個程序只占用一小部分CPU時間,那么使用tkinter會很麻煩,因為每個程序都將異步運行並且不會阻止程序執行其他操作。 使用阻塞事件系統,您必須為每個所需的組合編寫一個新的動畫。

這應該工作

class _GetchUnix:
    def init(self):
        import tty, sys
    def call(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch
class _GetchWindows:
    def init(self):
        import msvcrt
    def call(self):
        import msvcrt
        return msvcrt.getch()
class _Getch:
    def init(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            self.impl = _GetchUnix()

def __call__(self): return self.impl() getch = _Getch() while True: if getch.impl(): print getch.impl()

所需的一切都由while循環決定。 然后,無論何時調用getch.impl()它都會等待輸入,但是如果沒有輸入,它將繼續運行。 這就是為什么我使用while循環

免責聲明
這不是我的代碼,請簽出:
http://code.activestate.com/recipes/134892/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM