【问题标题】:wxPython Update Progress Dialog from separate thread来自单独线程的 wxPython 更新进度对话框
【发布时间】:2013-09-24 17:13:51
【问题描述】:

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

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()

我什至试图放弃课程并将对话框直接插入函数中,但没有运气。任何帮助将不胜感激。

【问题讨论】:

    标签: python multithreading wxpython


    【解决方案1】:

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

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

    【讨论】:

    • 所以我假设我可以使用 os.path.getsize() 来处理文件的大小。不过,问你一个问题,我是否必须像你一样使用一个列表来遍历文件,因为它们上传并以这种方式与 guage 对话?
    • 好的,新问题。我一直在阅读日志记录食谱,现在我实际上是误会了,因为我想到了我的脚本中实际执行的内容。我不是在“上传”,而是在复制。所有信息都将转到映射在用户驱动器上的 sharepoint 共享文档文件夹。很抱歉造成混乱。
    • 我会使用 os.stat 来获取每个文件的文件大小,然后将它们加起来并将其用于您的仪表范围。
    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多