来自单独线程的wxPython更新进度对话框

时间:2013-09-24 17:13:52

标签: python multithreading wxpython

我正在尝试运行一个进度对话框,该对话框不仅仅是在计时器上,而是根据上传到服务器的文件的状态进行更新。我不关心进度条是如何在视觉上表示的,我只是希望它能够准确地反映出它正在跟踪的过程。我尝试在while上使用ifthread.isAlive(),但在进程运行时,这不会给我一个活动栏。这是我正在使用的栏以及被调用线程的源。

class ProgBar(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(
            self, None, wx.ID_ANY, "Please wait."
            )
        self.Centre()
        max = 250

        dlg = wx.ProgressDialog(
            "Please wait.", 
            "Please wait while your request is processed.",
            maximum = max,
            parent=self,
            style = wx.PD_CAN_ABORT
            |wx.PD_APP_MODAL
            |wx.PD_AUTO_HIDE
            )

        keepGoing = True
        count = 0

        while keepGoing and count < max:
            count += 1
            wx.MilliSleep(50)

            if count >= max / 2:
                (keepGoing, skip) = dlg.Update(count)
            else:
                (keepGoing, skip) = dlg.Update(count)

        dlg.Destroy()

和线程......

def UploadToServer(self, event):
    if PepTalkSource is None:
        dlg = wx.MessageDialog(self,
        "You must attach a Pep Talk file!",
        "Missing Attachments!", wx.OK|wx.ICON_QUESTION)
        result = dlg.ShowModal()
        dlg.Destroy()
    else:
        if os.path.isdir(
        r"\\server\address\goes\here"
        ):
            ThreadOne = FuncThread(CopyMove, ())
            ThreadOne.start()
            dlg = ProgBar()
            ThreadOne.join()
        else:
            dlg = wx.MessageDialog(self,
            "The server could not be reached.  Please visit the Help Menu.",
            "Server Unavailable", wx.OK|wx.CANCEL|wx.ICON_QUESTION)
            result = dlg.ShowModal()
            dlg.Destroy()

我甚至试图抛弃这个类并直接插入对话框而没有运气。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我本月早些时候在博客上写过这样的事情:

我认为你需要的是wx.Gauge小部件。您可以使用Python来确定要上载的文件的大小,并使用该信息来设置仪表的范围。然后你会想要在一个线程中进行上传,但是要用块。因此,您也将以块的形式读取文件,例如1024K,并将它以相同的块写入服务器。每次写入后,您都会更新进度条。