xcgui做python界面,如何在子线程中更新UI?
spooking 归属分类: 开发 评论数: 0 个
import xcgui
from xcgui import XApp, XWindow, XButton, XEdit
import queue
import threading


uiUper = queue.Queue()


class DemoWindow(XWindow):
    def __init__(self):
        super(DemoWindow, self).__init__(400, 300, "XCGUI界面库 for python")
        self.enableLayout(True)
        self.setAlignV(xcgui.layout_align_center)
        self.setAlignH(xcgui.layout_align_center)
        self.enableHorizon(False)
        self.setSpace(20)
        self.regEvent(xcgui.WM_TIMER,self.onTimer)
        self.setTimer(1,10)
        self.btn = XButton(100, 30, "测试", self)
        self.btn.regEvent(xcgui.XE_BNCLICK, self.onBtnClick)
        self.edit = XEdit(200, 30, self)
    
    def onTimer(self,id,handled):
        try:
            # 从队列中获取任务
            task, arg = uiUper.get(timeout=0.001)
            if task == "callUiReander":
                self.callUiReander(arg)
            uiUper.task_done()
        except queue.Empty:
            pass

    def callUiReander(self,ui):
        ui(self)

    def callThread2Ui(self,ui,th,*args):
        def thread(uiUper,ui,th,*args):
            th(*args)
            uiUper.put(("callUiReander", ui))
        thread = threading.Thread(target=thread, args=(uiUper,ui,th,*args))
        thread.start()


    def onBtnClick(self, event, userdata):
        def ui(self):
            self.edit.setText("你好,世界!")
            self.edit.redraw(True)
        def th(a,b):
            import time
            time.sleep(1)
            print(a,b)

        self.callThread2Ui(ui,th,"参数1","参数2")
        

if __name__ == '__main__':
    app = XApp()
    window = DemoWindow()
    window.showWindow()
    app.run()
    app.exit()