我遇到了在Mac上的另一个线程中使用PyAutoGui进行按键操作的问题。这是我得到的错误:
Python[39499:497432] pid(39499)/euid(501) is calling TIS/TSM in non-main thread environment, ERROR : This is NOT allowed. Please call TIS/TSM in main thread!!!
就像消息说的那样,当我在主线程中运行它时,它可以正常工作。但我希望在单独的线程中执行操作,以免阻塞UI。有办法解决这个问题吗?在Windows机器上看起来工作正常。
信息
要重现,请运行以下代码,然后在弹出的窗口中单击Start
按钮。
import threading
import pyautogui
import tkinter as tk
from tkinter import ttk
def press_key():
pyautogui.press('a')
def handle_button_press():
t = threading.Thread(target=press_key)
t.start()
def main():
root = tk.Tk()
root.title('Crash')
content = ttk.Frame(root, width=200, height=200)
button = tk.Button(content, text='Start', command=handle_button_press)
# Layout
content.grid(column=0, row=0, sticky=(tk.N, tk.E, tk.S, tk.W))
button.grid(column=0, row=0, sticky=(tk.N, tk.E, tk.S, tk.W))
content.rowconfigure(0, weight=1)
content.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
root.mainloop()
if __name__ == '__main__':
main()
解决它的一种方法是使用过程。
这不是线程解决方案,但它可以正常工作,并且不会阻塞主线程。
这里的代码稍作修改。
import multiprocessing
import pyautogui
import tkinter as tk
from tkinter import ttk
import time
def press_key():
pyautogui.press('a')
def handle_button_press():
p = multiprocessing.Process(target=press_key)
p.start()
def main():
root = tk.Tk()
root.title('Crash')
content = ttk.Frame(root, width=200, height=200)
button = tk.Button(content, text='Start', command=handle_button_press)
# Layout
content.grid(column=0, row=0, sticky=(tk.N, tk.E, tk.S, tk.W))
button.grid(column=0, row=0, sticky=(tk.N, tk.E, tk.S, tk.W))
content.rowconfigure(0, weight=1)
content.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
root.mainloop()
if __name__ == '__main__':
main()