我想在Checkbutton为ON时调用功能doit,而在OFF为OFF时停止它。
我尝试使用按钮来完成此操作,但它确实可行,但是当我将CheckButton置于ON并单击按钮时,窗口冻结,无法再次将其关闭。
from tkinter import *
import PIL.ImageGrab
from PIL import ImageGrab
import time
import cv2
import numpy as np
import pyautogui
import random
def doit():
time.clock()
while label_text.get()=="ON":
rgb = PIL.ImageGrab.grab().load()[1857,307]
print(rgb)
print(time.clock())
else:
print('module is turned OFF')
window = Tk()
label_text = StringVar()
label = Label(window, textvariable=label_text)
label_text.set("OFF")
check=Checkbutton(window, text=label_text.get(), variable=label_text,
onvalue="ON", offvalue="OFF")
label.pack()
check.pack(side="left")
b = Button(window, text="OK", command=doit)
b.pack()
window.mainloop()
答案 0 :(得分:0)
当您运行长期运行的进程(while循环)时,mainloop无法工作,并且无法从系统获取鼠标/键盘事件,无法将事件发送到小部件,更新小部件,重绘窗口。
您可以一次运行doit
-不运行while
-然后在一段时间后使用after(time, doit)
来运行它。这样mainloop
将有时间完成工作。
def doit():
time.clock()
if label_text.get() == "ON":
rgb = PIL.ImageGrab.grab().load()[1857,307]
print(rgb)
print(time.clock())
after(50, doit)
else:
print('module is turned OFF')
或使用window.update()
中的while
来给mainloop
时间来更新元素。
def doit():
time.clock()
while label_text.get() == "ON":
rgb = PIL.ImageGrab.grab().load()[1857,307]
print(rgb)
print(time.clock())
window.update()
else:
print('module is turned OFF')
如果PIL.ImageGrab.grab()
运行时间更长,则可能必须在单独的线程中运行它。