我正在使用 tkinter 在 Python 中编写一个小型计时模块。在这方面,我想全局监控何时按下退出键来停止计时。
不幸的是,tkinters“.bind”和“.bind_all”函数仅在窗口处于焦点时才拾取击键。
我已经研究了其他几个用于记录击键的解决方案,包括包“keyboard”和“pynput”,但是这些包需要运行一个 while 循环,这使得 tkinter GUI 冻结并停止工作。
我找到了这个线程,但它对于具体展示如何完成它并不是很有帮助:无需在 tkinter 上绘制画布或框架即可检测按键 https://stackoverflow.com/questions/45017956/detect-keypress-without-drawing-canvas-or-frame-on-tkinter
我尝试过一些不同的选择
选项 1:使用 tkinter 循环功能,但按下按键时不注册
import keyboard
def _check_esc_pressed(self):
if self.run_active and keyboard.press('esc'):
self.Lap()
self.Stop()
self.after(50, self._check_esc_pressed())
选项 2:冻结 tkinter 客户端
import keyboard
def _check_esc_pressed(self):
while True:
if keyboard.is_pressed('esc'):
self.Lap()
self.Stop()
break
else:
pass
选项 3:冻结 tkinter 客户端
from pynput.keyboard import Key, Listener
def on_release(self, key):
if key == Key.esc:
self.Lap()
self.Stop()
# Stop listener
return False
def _check_esc_pressed(self):
def on_press(key):
pass
with Listener(
on_press=on_press,
on_release=on_release) as listener:
listener.join()
我预计按 escape 将终止“_check_esc_pressed”功能,注册一圈并停止计时器。仅当运行处于活动状态时才应处理逃逸检查