Вы можете FAKE переходы между градиентами, используя переходы в непрозрачности нескольких уложенных градиентов, как описано в нескольких ответах здесь:
Вы также можете переместить позицию, как описано здесь:
Переход градиента CSS3 с фоновой позицией .
Еще несколько методы здесь:
Ваш процесс графического интерфейса не должен выполняться ни в каком потоке. только данные должны быть пронизаны.
При необходимости полученные данные передаются в процесс графического интерфейса пользователя (или процесс графического интерфейса, уведомляемый о новых доступных данных). Мне может понадобиться использовать мьютекс для совместного использования ресурса данных между потоком сбора данных и графическим интерфейсом (при копировании)
основной цикл будет выглядеть так:
Эта функция вызывается каждую секунду и выходит за пределы обычного обновления.
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)
Функция вызывается одна, и все, что происходит внутри нее, не блокирует нормальную работу интерфейса.
У меня была такая же проблема с 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()