Python PyAutoGui按键在Mac上的单独线程中崩溃

问题描述 投票:0回答:1

我遇到了在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机器上看起来工作正常。

信息

  • Python:3.8.3
  • OS:Mac MoJave 10.14.6
  • TkInter:8.5

要重现,请运行以下代码,然后在弹出的窗口中单击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()
python multithreading macos tkinter pyautogui
1个回答
0
投票

解决它的一种方法是使用过程。

这不是线程解决方案,但它可以正常工作,并且不会阻塞主线程。

这里的代码稍作修改。

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()
© www.soinside.com 2019 - 2024. All rights reserved.