Код Python активируется с помощью флажка / кнопки - PullRequest
1 голос
/ 23 апреля 2019

Я хочу вызвать функцию doit, когда Checkbutton включена, и остановить ее, когда она выключена.

Я пытался сделать это с помощью кнопки, и она вроде работает, но когда я включил CheckButton и нажал кнопку, мое окно зависло, и я не могу выключить его снова.

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 голосов
/ 24 апреля 2019

Когда вы запускаете долго выполняемый процесс - ваш цикл 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() работает дольше, возможно, вам придется запустить его в отдельном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...