Demo entry 6326396

progresbar_wx

   

Submitted by Alex on Nov 23, 2016 at 08:40
Language: Python 3. Code size: 3.4 kB.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import wx
 
from threading import Thread
 
# Определяем событие, означающее завершение потока
EVT_RESULT_ID = wx.NewId()
 
def EVT_RESULT(win, func):
    """Определяем событие завершения."""
    win.Connect(-1, -1, EVT_RESULT_ID, func)
#----------------------------------------------------------------------
class ResultEvent(wx.PyEvent):
    """Простое события для разных данных."""
    def __init__(self, data):
        """Инициируем событие завершения."""
        wx.PyEvent.__init__(self)
        self.SetEventType(EVT_RESULT_ID)
        self.data = data
 
#----------------------------------------------------------------------
class TestThread(Thread):
    """Тест rласса Thread(Поток)."""
 
    #----------------------------------------------------------------------
    def __init__(self, wxObject):
        """Инициализируем поток."""
        Thread.__init__(self)
        self.wxObject = wxObject
        self.start()    # запускаем поток
 
    #----------------------------------------------------------------------
    def run(self):
        """Запускаем процесс в потоке."""
        # Код, выполняемый в потоке
        for amtOfTime in range(100):
            time.sleep(0.1)
            wx.PostEvent(self.wxObject, ResultEvent(amtOfTime))
        wx.PostEvent(self.wxObject, ResultEvent("Поток финишировал!"))
 
#----------------------------------------------------------------------
class FramePB(wx.Frame):
    def __init__(self):
        wx.Frame.__init__ ( self, None, id = wx.ID_ANY, title = u"Отчет", pos = wx.DefaultPosition, size = wx.Size( 650,150 ), style = wx.CAPTION|wx.FRAME_TOOL_WINDOW|wx.MAXIMIZE_BOX|wx.MINIMIZE_BOX|wx.STAY_ON_TOP|wx.TAB_TRAVERSAL )

        # Layout
        self.CreateStatusBar()
        self.PushStatusText("Информация о ходе процесса.")

        self.panel = TestPanel(self, None)
        
        
#----------------------------------------------------------------------

class TestPanel(wx.Panel):
    def __init__(self, parent, log):
        wx.Panel.__init__(self, parent, -1)
        self.log = log
        self.count = 0
        self.hParent = parent

        self.sstext = (wx.StaticText(self, -1, "Выполнение: ", (10, 20)),wx.StaticText(self, -1, "  0", (100, 20)),wx.StaticText(self, -1, " % ", (120, 20)))
        self.progressbar = wx.Gauge(self, -1, 101, (10, 50), (610, 25))
        TestThread(self)
        # устанавливаем обработчик для завершения потока
        EVT_RESULT(self, self.updateDisplay)        

     

    def __del__(self):
        pass



    #----------------------------------------------------------------------
    def updateDisplay(self, msg):
        """
        Получаем данные от потока и обновляем приложение
        """
        t = msg.data
        
        if isinstance(t, int):
            self.sstext[1].LabelText = str(t)
            self.progressbar.SetValue(t)
        else:
            self.hParent.Destroy()
#----------------------------------------------------------------------
def main():
    app = wx.App()
    frame = FramePB()
    frame.Show(True)
    app.MainLoop()
 
#----------------------------------------------------------------------
# Запускаем программу
if __name__ == "__main__":
    main()

This snippet took 0.00 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).