【问题标题】:"Not Responding" while in function在功能中“无响应”
【发布时间】:2021-11-04 22:21:28
【问题描述】:

我尝试使用 tkinter 创建一个 python 脚本,它将每 170 秒移动一次鼠标(预期为 17 秒用于在代码中进行测试)。
目标:
我想要 2 个按钮:

  • 首先启动移动鼠标的功能,等待 170 秒,再次运行等。
  • 第二次关闭该功能而不关闭我的 .pyw 脚本中的窗口
    问题:
    我认为第二个按钮不会按预期工作,主要问题是在time.sleep(17) 期间,窗口显示“无响应。

    请注意,我是 Python 的绝对初学者
    请在下面查看我的代码:
import time
import tkinter as Tk
root = Tk.Tk()

root.title("MouMo")
root.geometry("300x100")
root.configure(bg='white')

def turnon():
    onbtn['state'] = Tk.DISABLED
    while ( onbtn['state'] == Tk.DISABLED ) :
        pyautogui.moveRel(0, 30, duration=1)
        pyautogui.moveRel(0, -30, duration=1)
        time.sleep(17)
            

def turnoff():
    onbtn['state'] = Tk.NORMAL

onbtn = Tk.Button(root, text="ON", padx=50, command = turnon)
offbtn = Tk.Button(root, text="OFF", padx=50, command = turnoff)

onbtn.pack(side="left")
offbtn.pack(side="right")

root.mainloop()

提前感谢您的帮助!

【问题讨论】:

    标签: python tkinter pyautogui


    【解决方案1】:

    不建议在 tkinter 应用程序中使用 while 循环和 time.sleep(),因为它会阻止 tkinter mainloop() 处理挂起的事件和更新。

    使用.after()替换while循环和sleep()

    def turnon(first=True):
        if first:
            onbtn['state'] = Tk.DISABLED
            onbtn.update_idletasks() # make the state updated immediately
        if onbtn['state'] == Tk.DISABLED:
            pyautogui.moveRel(0, 30, duration=1)
            pyautogui.moveRel(0, -30, duration=1)
            # execute turnon() after 17 seconds
            onbtn.after(17000, turnon, False)
    

    【讨论】:

    • 谢谢!有效。我不能支持您的回答,因为我的声誉很低 :)) 但非常感谢您的回答。
    • @RobertCenusa 你可以accept the answer.
    • 完成!请再问一个问题:您能否确认关闭按钮真的会停止该功能并且循环不会在后台永远运行,从而导致 CPU 问题?谢谢
    • @RobertCenusa 是的,Off 按钮将停止 after() 任务。
    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多