Пишу программку GUI с использованием потоков.
Цель: необходимо чтобы при долгих вычислениях выводилась картинка (типа ждите идет загрузка). По завершении вычислений картинка закрывается.
Реализовал: 2 окна. Основной класс использует класс картинки в init. Далее основной класс продолжает свою работу в другом потоке, т.к. иначе картинку не показывалась б.
Проблема: Я не понимаю что происходит на 4 этапе. Главное окно перерисовывает панель? почему тогда все дочерние элементы (в данном случае контрол) не перерисовывает? Мб есть какие нить другие решения?
Я пробовал и update и refresh по завершении работы потока, но не помогает.
Вот картинка (gif) показывает что происходит после запуска, и на определенных этапах:
![](http://s018.radikal.ru/i528/1201/b6/49682092bade.gif)
# -*- coding: utf-8 -*-
import wx
import wx.animate
import time
import threading
class LoaderImage(wx.Frame):
def __init__(self, img = ''):
style = ( wx.CLIP_CHILDREN | wx.STAY_ON_TOP | wx.FRAME_NO_TASKBAR | wx.NO_BORDER | wx.FRAME_SHAPED )
wx.Frame.__init__(self, None, title='LoaderImage', style = style)
#self.SetTransparent( 220 )
self.ag = wx.animate.GIFAnimationCtrl(self, -1, img, pos=(0, 0))
self.SetSize(self.ag.GetSize())
self.ag.GetPlayer().UseBackgroundColour(True)
self.ag.Play()
self.Center()
self.Show(True)
def close(self):
self.Close()
class Main(wx.Frame, threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
wx.Frame.__init__(self, None, title='Main', pos = (30, 100), size = (350, 250))
self.panel = wx.Panel(self, -1)
self.panel.SetBackgroundColour('#A0A030')
self.Center()
self.Show(True)
# Создаем анимацию в главном потоке, иначе ругается на вызов self.ag.Play() в классе LoaderImage:
# PyAssertionError: ... in wxTimerBase::Start(): timer can only be started from the main thread
self.ani = LoaderImage("ajax-loader.gif")
# Затем мы делаем определенные действия, к примеру добавляем контрол на панель
# И выполняем это в другом потоке, иначе анимация не начнется, пока главный поток
# не завершится
# Запускаем поток по созданию контрола
self.start()
def run(self):
# см картинку 1
time.sleep(2)
self.text = wx.TextCtrl(self.panel, -1, "asd", pos = (50, 20))
# см картинку 2
time.sleep(2)
self.ani.close()
# см картинку 3
time.sleep(2)
# см рисунок 4, точнее скрин не с этого места, а когда поток прорабатывается, и программа
# так сказать переходит в режим ожидания (MainLoop)
app = wx.App(0)
f = Main()
app.MainLoop()