Как сделать поток Tkinter GUI безопасным?

Вы можете FAKE переходы между градиентами, используя переходы в непрозрачности нескольких уложенных градиентов, как описано в нескольких ответах здесь:

анимация CSS3 с градиентами .

Вы также можете переместить позицию, как описано здесь:

Переход градиента CSS3 с фоновой позицией .

Еще несколько методы здесь:

Анимация градиентов CSS3 .

2
задан K-Doe 20 January 2019 в 17:06
поделиться

3 ответа

Ваш процесс графического интерфейса не должен выполняться ни в каком потоке. только данные должны быть пронизаны.

При необходимости полученные данные передаются в процесс графического интерфейса пользователя (или процесс графического интерфейса, уведомляемый о новых доступных данных). Мне может понадобиться использовать мьютекс для совместного использования ресурса данных между потоком сбора данных и графическим интерфейсом (при копировании)

основной цикл будет выглядеть так:

0
ответ дан sancelot 20 January 2019 в 17:06
поделиться

Эта функция вызывается каждую секунду и выходит за пределы обычного обновления.

def start(self,parent):
    self.close=False
    self.Refresh(parent)

def Refresh(self,parent):
    '''your code'''
    if(self.close == False):
        frame.after( UpdateDelay*1000, self.Refresh, parent)

Функция вызывается одна, и все, что происходит внутри нее, не блокирует нормальную работу интерфейса.

0
ответ дан Luca Di Sabatino 20 January 2019 в 17:06
поделиться

У меня была такая же проблема с tkinter, и использование событий pypubsub было моим решением. Как указано в комментариях выше, вы должны запустить свой расчет в другой ветке, а затем отправить его в ветку графического интерфейса.

import time
import tkinter as tk
import threading
from pubsub import pub

lock = threading.Lock()


class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.label = tk.Label(root, text="Temperature / Humidity")
        self.label.pack(side="top", fill="both", expand=True)

    def listener(self, plot_data):
        with lock:
            """do your plot drawing things here"""
            self.label.configure(text=plot_data)


class WorkerThread(threading.Thread):
    def __init__(self):
        super(WorkerThread, self).__init__()
        self.daemon = True  # do not keep thread after app exit
        self._stop = False

    def run(self):
        """calculate your plot data here"""    
        for i in range(100):
            if self._stop:
                break
            time.sleep(1)
            pub.sendMessage('listener', text=str(i))


if __name__ == "__main__":
    root = tk.Tk()
    root.wm_geometry("320x240+100+100")

    main = MainApplication(root)
    main.pack(side="top", fill="both", expand=True)

    pub.subscribe(main.listener, 'listener')

    wt = WorkerThread()
    wt.start()

    root.mainloop()
0
ответ дан Sinan Çetinkaya 20 January 2019 в 17:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: