Wic*_*xin 1 python winapi multithreading tkinter keypress
我正在使用Tkinter在Python中编写GUI程序,我需要一种方法来检查是否正在发生按键操作而不使用我的所有CPU.目前我正在使用线程模块启动一个线程,该线程将检查按键而不冻结接口(Tkinter).我在我的线程中的while循环中使用win32api.GetKeyState(),以便它不断检查键的状态,因为它需要能够判断键是否被按下,即使窗口没有焦点.问题是程序在我启动线程时使用100%cpu.如果我在循环中放置一个time.sleep(),它会大大减少cpu的使用量,但实际的按键和它知道你按下一个键的时间之间会有一个延迟.有没有一种方法可以捕获按键,即使窗口没有聚焦而没有使用这么多的CPU也会被按下?
from Tkinter import *
import win32api
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
coords = StringVar()
Label(master=self, textvariable=coords).pack()
def GetCoords():
coords.set(str(win32api.GetCursorPos()))
root.bind_all("<Scroll_Lock>", self.GetCoords)
root = Tk()
app = Application(master=root)
#root.wm_iconbitmap(default='INSERT ICON HERE')
#root.wm_title("TITLE OF PROGRAM")
#app.master.maxsize(640, 480)
app.master.minsize(640, 480)
app.master.resizable(0, 0)
app.mainloop()
app.quit()
Run Code Online (Sandbox Code Playgroud)
该脚本给出了以下结果:AttributeError:应用程序实例没有属性'GetCoords'
您希望捕获关键事件,而不是轮询当前键盘状态.
请参阅TkInter文档中的事件和绑定,其中有一个简单的示例,可以完全满足您的需求(另外,它是跨平台而不是仅限Win32).
这通常是所有GUI编程(以及网络服务器)的问题,答案总是相同的.无论是否有线程,您都不会直接使用非阻塞"检查当前X状态"调用.在主线程中,您要求事件循环"在X状态更改时调用我的函数",或者您创建一个后台线程并阻止"等待直到X发生"调用.
事件循环上的维基百科页面实际上对此有很好的描述.
看看你编辑的版本,你现在遇到了一个全新的问题:
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
coords = StringVar()
Label(master=self, textvariable=coords).pack()
def GetCoords():
coords.set(str(win32api.GetCursorPos()))
root.bind_all("<Scroll_Lock>", self.GetCoords)
Run Code Online (Sandbox Code Playgroud)
GetCoords是一个在里面定义的局部函数Application.__init__.但是你正在尝试使用它,好像它是一种方法Application.你不能做,self.GetCoords除非GetCoords是一种方法self.这正是错误信息的AttributeError: Application instance has no attribute 'GetCoords'含义.
但是你可以通过GetCoords取出self.前缀来传递本地函数.我不确定这会做你的想法(因为我不确定你是否可以关闭StringVar那样的),但是......试试看.
或者,你可以做 GetCoords只是通过移动出来的方法def __init__,给它一个self参数.然后你可以访问self.GetCoords,并获得一个绑定的方法,你可以完全按照你想要的方式传递.但是,在这种情况下,它将无法再访问coords,因为这是一个局部变量__init__.要解决这个问题,请将该局部变量更改为成员变量,方法是使用self.coordsin __init__和GetCoords(以及其他任何地方)而不是coords.
| 归档时间: |
|
| 查看次数: |
874 次 |
| 最近记录: |