最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WxPython界面利用pubsub如何實現(xiàn)多線程控制

 更新時間:2022年11月01日 11:21:45   作者:陳年椰子  
這篇文章主要介紹了WxPython界面利用pubsub如何實現(xiàn)多線程控制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

WxPython界面用pubsub實現(xiàn)多線程控制

用WxPython做界面時, 如果數(shù)據(jù)操作時間比較長,會使 WxPython 界面處于假死狀態(tài),用戶體驗非常不好。

WxPython是利用pubsub來完成消息的傳送。

下面提供一個 WxPython界面利用pubsub 實現(xiàn)2個線程的控制的例子

實際使用, 只要修改WorkThread1、WorkThread2 里的 run 內(nèi)容 及 MainFrame 里的 updateDisplay 內(nèi)容即可。

在此基礎(chǔ)上,可以實現(xiàn)多線程。

Python 3.7.3
wxPython          4.0.6
Pypubsub          4.0.3

在此之前有個單線程及進(jìn)度條的例子,簡單需求可以參考這個

下面提供本文的代碼

# encoding: utf-8
"""
@author: 陳年椰子
@contact: hndm@qq.com
@version: 1.0
@project:test 
@file: wx_thread.py
@time: 2022-3-24 15:34
說明
"""
 
import wx
from pubsub import pub
from time import sleep
import time
import threading
import sys
from random import random
 
 
# 線程調(diào)用耗時長代碼
class WorkThread1(threading.Thread):
    def __init__(self):
        """Init Worker Thread Class."""
        threading.Thread.__init__(self)
        self.breakflag = False
        self.start()
 
    def stop(self):
        self.breakflag = True
 
    # 耗時長的代碼
    def workproc(self):
        while True:
            if self.breakflag:
                pub.sendMessage("update", mstatus='查詢Thread中斷')
                sleep(2)
                break
            ts1 = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
            t_sum = "查詢的結(jié)果"
            # print(ts1,t_sum)
            #  此處加的數(shù)據(jù)庫代碼
            pub.sendMessage("update", mstatus='{}:查詢最后10個數(shù)據(jù)并匯總{}'.format(ts1, t_sum))
            sleep(10)
        pub.sendMessage("update", mstatus='workdone')
        return ""
 
    def run(self):
        """Run Worker Thread."""
        pub.sendMessage("update", mstatus='workstart')
        self.workproc()
 
 
 
 
# 線程調(diào)用耗時長代碼
class WorkThread2(threading.Thread):
    def __init__(self):
        """Init Worker Thread Class."""
        threading.Thread.__init__(self)
        self.breakflag = False
        self.start()
 
    def stop(self):
        self.breakflag = True
 
    # 耗時長的代碼
    def workproc(self):
        while True:
            if self.breakflag:
                pub.sendMessage("update", mstatus='隨機(jī)數(shù)Thread中斷')
                sleep(2)
                break
            ts1 = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
            t_info = "隨機(jī)數(shù){}".format(str(random()))
            # print(ts1, t_info)
            #  此處加的數(shù)據(jù)庫代碼
            pub.sendMessage("update", mstatus='{}:產(chǎn)生{}'.format(ts1, t_info))
            sleep(1)
        pub.sendMessage("update", mstatus='workdone')
        return ""
 
    def run(self):
        """Run Worker Thread."""
        pub.sendMessage("update", mstatus='workstart')
        self.workproc()
 
 
 
class MainFrame(wx.Frame):
    """
    簡單的界面
    """
 
    def __init__(self, *args, **kw):
        # ensure the parent's __init__ is called
        super(MainFrame, self).__init__(*args, **kw)
        self.SetSize(size=(600, 400))
 
        # create a panel in the frame
        pnl = wx.Panel(self)
 
        # and put some text with a larger bold font on it
        self.st = wx.StaticText(pnl, label="分析工具 V 2022", pos=(25, 25))
        self.st2 = wx.StaticText(pnl, label="提示", pos=(25, 80))
        font = self.st.GetFont()
        font.PointSize += 2
        font = font.Bold()
 
        self.st.SetFont(font)
        self.st2.SetFont(font)
 
        # create a menu bar
        self.makeMenuBar()
 
        self.gauge = wx.Gauge(self, range=100, size=(500, 20))
        self.gauge.SetBezelFace(3)
        self.gauge.SetShadowWidth(3)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.st, 0, wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer.Add(self.st2, 0, wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer.Add(self.gauge, 0, wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, 0)
 
        self.SetSizer(sizer)
 
        # and a status bar
        self.CreateStatusBar()
        self.SetStatusText("啟動完成!")
 
        pub.subscribe(self.updateDisplay, "update")
 
    def makeMenuBar(self):
        """
        A menu bar is composed of menus, which are composed of menu items.
        This method builds a set of menus and binds handlers to be called
        when the menu item is selected.
        """
 
        # Make a file menu with Hello and Exit items
        fileMenu = wx.Menu()
        # The "\t..." syntax defines an accelerator key that also triggers
        # the same event
        # helloItem = fileMenu.Append(-1, "&Hello...\tCtrl-H",
        #         "Help string shown in status bar for this menu item")
        self.startItem = fileMenu.Append(-1, "開始",
                                         "開始工作")
        self.stopItem = fileMenu.Append(-1, "停止",
                                        "中斷工作")
        fileMenu.AppendSeparator()
        self.exitItem = fileMenu.Append(-1, "退出",
                                        "退出")
 
        # Now a help menu for the about item
        helpMenu = wx.Menu()
        aboutItem = helpMenu.Append(-1, "關(guān)于",
                                    "WxPython 界面與線程通訊的例子")
 
        # Make the menu bar and add the two menus to it. The '&' defines
        # that the next letter is the "mnemonic" for the menu item. On the
        # platforms that support it those letters are underlined and can be
        # triggered from the keyboard.
        self.menuBar = wx.MenuBar()
        self.menuBar.Append(fileMenu, "工作")
        self.menuBar.Append(helpMenu, "信息")
 
        # Give the menu bar to the frame
        self.SetMenuBar(self.menuBar)
        self.stopItem.Enable(False)
 
        self.count = 0
 
        # Finally, associate a handler function with the EVT_MENU event for
        # each of the menu items. That means that when that menu item is
        # activated then the associated handler functin will be called.
        self.Bind(wx.EVT_MENU, self.OnStart, self.startItem)
        self.Bind(wx.EVT_MENU, self.OnStop, self.stopItem)
        self.Bind(wx.EVT_MENU, self.OnExit, self.exitItem)
        self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)
 
    def OnExit(self, event):
        """Close the frame, terminating the application."""
        try:
            self.work1.stop()
            self.work2.stop()
            sleep(2)
        except:
            pass
        self.Close(True)
        sys.exit()
 
    def OnStart(self, event):
        self.work1 = WorkThread1()
        self.work2 = WorkThread2()
 
    def OnStop(self, event):
        self.work1.stop()
        self.work2.stop()
 
    def OnAbout(self, event):
        """Display an About Dialog"""
        wx.MessageBox("分析工具 v2019",
                      "關(guān)于",
                      wx.OK | wx.ICON_INFORMATION)
 
    def updateDisplay(self, mstatus):
        """
        Receives data from thread and updates the display
        """
        # print('pub display', mstatus)
        if mstatus.find("workstart") >= 0:
            self.SetStatusText('開始工作,代碼不提供中斷線程語句,請等待!')
            self.startItem.Enable(False)
            self.stopItem.Enable(True)
            self.exitItem.Enable(False)
        if mstatus.find("workdone") >= 0:
            self.SetStatusText('完成!')
            self.stopItem.Enable(False)
            self.startItem.Enable(True)
            self.exitItem.Enable(True)
        else:
            if mstatus.find("查詢")>=0:
                self.st.SetLabel(mstatus)
            else:
                self.st2.SetLabel(mstatus)
            # if mstatus.find(",") > 0 and mstatus.find("計算") >= 0:
            #     mdata = mstatus.split(',')
            #     # 示范 , 實際使用需要傳送進(jìn)度
            #     # print(int(mdata[0].replace('計算','')))
            #     g_count = int(mdata[0].replace('計算', ''))
            #     self.gauge.SetValue(g_count)
 
 
def test():
    app = wx.App()
    frm = MainFrame(None, title='分析工具')
    frm.Show()
    app.MainLoop()
 
 
if __name__ == "__main__":
    test()

運(yùn)行后, 點(diǎn)擊 工作-開始。 2個線程開始工作,直到點(diǎn)擊工作-結(jié)束

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python使用技巧-文件讀寫

    python使用技巧-文件讀寫

    這篇文章主要介紹了python使用技巧-文件讀寫,Python提供了非常方便的文件讀寫功能,其中open是讀寫文件的第一步,通過open讀寫文件的方式和把大象裝冰箱是一樣的,下面我們就來具體介紹該內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02
  • 幾種實用的pythonic語法實例代碼

    幾種實用的pythonic語法實例代碼

    在我理解,Pythonic 就是很 Python 的 Python 代碼。下面這篇文章主要給大家分享介紹了幾種實用的pythonic語法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • 如何在 Matplotlib 中更改繪圖背景的實現(xiàn)

    如何在 Matplotlib 中更改繪圖背景的實現(xiàn)

    這篇文章主要介紹了如何在 Matplotlib 中更改繪圖背景的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 基于python實現(xiàn)分析識別文章/內(nèi)容中的高頻詞和關(guān)鍵詞

    基于python實現(xiàn)分析識別文章/內(nèi)容中的高頻詞和關(guān)鍵詞

    要分析一篇文章的高頻詞和關(guān)鍵詞,可以使用 Python 中的 nltk 庫和 collections 庫或者jieba庫來實現(xiàn),本篇文章介紹基于兩種庫分別實現(xiàn)分析內(nèi)容中的高頻詞和關(guān)鍵詞,需要的朋友可以參考下
    2023-09-09
  • Python Numpy教程之排序,搜索和計數(shù)詳解

    Python Numpy教程之排序,搜索和計數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了Python?NumPy中排序,搜索和計數(shù)的實現(xiàn),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-08-08
  • python判斷列表字典字符串元組是否存在某個值或者空值(多種方法)

    python判斷列表字典字符串元組是否存在某個值或者空值(多種方法)

    這篇文章主要介紹了python判斷列表字典字符串元組是否存在某個值或者空值,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-02-02
  • python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法

    python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法

    這篇文章主要介紹了python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法,具有很好的參考價值,希望對大家有所幫助。
    2021-06-06
  • Python 字典與字符串的互轉(zhuǎn)實例

    Python 字典與字符串的互轉(zhuǎn)實例

    下面小編就為大家?guī)硪黄狿ython 字典與字符串的互轉(zhuǎn)實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • python讀取當(dāng)前目錄下的CSV文件數(shù)據(jù)

    python讀取當(dāng)前目錄下的CSV文件數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了python讀取當(dāng)前目錄下的CSV文件數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • python thrift搭建服務(wù)端和客戶端測試程序

    python thrift搭建服務(wù)端和客戶端測試程序

    這篇文章主要為大家詳細(xì)介紹了python thrift搭建服務(wù)端和客戶端測試程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

泽库县| 来宾市| 田林县| 奉新县| 海门市| 梨树县| 博爱县| 贺兰县| 壤塘县| 昆明市| 安丘市| 凤山市| 十堰市| 连江县| 花莲市| 太湖县| 桂阳县| 克东县| 洛川县| 化德县| 五莲县| 手机| 桃源县| 沙雅县| 曲沃县| 马尔康县| 和田县| 恩施市| 巫溪县| 台南市| 张家川| 泾阳县| 白银市| 丰原市| 深州市| 保康县| 罗定市| 宝丰县| 古交市| 陇南市| 河南省|