Отключить события щелчков в очереди на виджете, пока выполняется другая функция - PullRequest
0 голосов
/ 02 октября 2018

У меня есть функция (A), которая связана с событием щелчка на холсте.В какой-то момент функция A вызывает другую функцию (B).Содержимое холста может измениться в функции B, поэтому я хочу, чтобы оно игнорировало события щелчка холста во время работы.Я попытался установить переменную bool, которая проверяется, когда функция A вызывается в False перед вызовом функции B, а затем сбрасывается в значение True, когда функция B завершена, но событие все еще стоит в очереди с неверными координатами мыши для нового содержимого,Я попытался повторно привязать события щелчка холста к функции (C), которая просто возвращает «break», затем вызывает функцию B, затем повторно привязывает события щелчка холста обратно к функции A. Тем не менее очереди с плохими координатами мыши для нового содержимого.Я попытался установить состояние холста на «отключен», вызывая функцию B, а затем установить состояние на «нормальный».Я попытался вернуть "break" из функции A, функции B и из обоих.Я получаю тот же результат, он все еще стоит в очереди с плохими координатами мыши для нового содержимого.Любые предложения?

код, который я использую для тестирования параметров в его текущем состоянии:

import time
from tkinter import *

class test_form(object):
    def __init__(self, master):
        self.master = master
        self._CreateGUI()

    def _CreateGUI(self):
        geom = "200x175+0+0"
        self.master.geometry(geom)
        self.xx=Canvas(bg='#ff0000',width=100,height=75)
        self.xx.bind('<ButtonRelease>',self.test_button)
        self.xx.pack()

    def waste_time(self):
        print('time wasted')
        time.sleep(10)
        return "break"

    def test_button(self,event=None):
        self.waste_time()
        return "break"

def start_gui():
    root = Tk()
    form_load = test_form(root)
    root.mainloop()

if __name__ == "__main__":
    start_gui()

1 Ответ

0 голосов
/ 03 октября 2018

Следующий подход, похоже, решит вашу проблему.Вероятно, он похож на тот, который вы уже пробовали, но с добавлением after():

class test_form(object):
    def __init__(self, master):
        self.master = master
        self._CreateGUI()

    def _CreateGUI(self):
        geom = "200x175+0+0"
        self.master.geometry(geom)
        self.xx = Canvas(bg='#ff0000', width=100, height=75)
        self.xx.pack()

        self.notice()

    def waste_time(self):
        print('time wasted')
        time.sleep(10)

    def notice(self):
        self.xx.bind('<ButtonRelease>', self.test_button)

    def ignore(self):
        self.xx.bind('<ButtonRelease>', lambda event: "break")

    def test_button(self, event):
        self.ignore()
        self.waste_time()
        self.master.after(500, self.notice)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...