"Not Responding" 在运行中
"Not Responding" while in function
我尝试使用 tkinter 创建一个 python 脚本,它将每 170 秒移动一次我的鼠标(预期,代码中测试 17 秒)。
目标:
我想要 2 个按钮:
- 第一个启动将移动鼠标的功能,等待 170 秒,运行 再次等
- 第二次关闭该功能而不关闭我的 .pyw 脚本中的 window
问题:
我认为第二个按钮不会按预期工作,主要问题是在 time.sleep(17)
期间 window 变为“无响应。
请注意,我是 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()
提前感谢您的帮助!
不建议在 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)
我尝试使用 tkinter 创建一个 python 脚本,它将每 170 秒移动一次我的鼠标(预期,代码中测试 17 秒)。
目标:
我想要 2 个按钮:
- 第一个启动将移动鼠标的功能,等待 170 秒,运行 再次等
- 第二次关闭该功能而不关闭我的 .pyw 脚本中的 window
问题:
我认为第二个按钮不会按预期工作,主要问题是在time.sleep(17)
期间 window 变为“无响应。
请注意,我是 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()
提前感谢您的帮助!
不建议在 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)