使用复选框/按钮激活的Python代码

时间:2019-04-23 18:35:17

标签: python-3.x tkinter

我想在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()

1 个答案:

答案 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()运行时间更长,则可能必须在单独的线程中运行它。