Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用wxPython显示进度_Python_Python 2.7_Wxpython - Fatal编程技术网

使用wxPython显示进度

使用wxPython显示进度,python,python-2.7,wxpython,Python,Python 2.7,Wxpython,我希望有人能帮助我展示使用wxPython长期运行任务的进度 我目前有一个函数,它由一个按钮调用,并执行其他5个函数,例如 def sum(self, event): self.processSents() self.processWords() self.repSents() self.measSim() self.selCont() 我想在执行这些函数时显示一个进度条,因为程序有时会挂起,这并不理想 我看过的很多解决方案都建议使用线程,但我对Pyth

我希望有人能帮助我展示使用wxPython长期运行任务的进度

我目前有一个函数,它由一个按钮调用,并执行其他5个函数,例如

def sum(self, event):
    self.processSents()
    self.processWords()
    self.repSents()
    self.measSim()
    self.selCont()
我想在执行这些函数时显示一个进度条,因为程序有时会挂起,这并不理想

我看过的很多解决方案都建议使用线程,但我对Python中的线程非常缺乏经验,而且我的尝试也没有什么进展。例如,我不确定对话框是在线程中,还是在执行代码中,或者两者都在

我目前的尝试如下:

def sum(self, event):
    progress = wx.ProgressDialog("sum in progress", "please wait", maximum=100, parent=self, style=wx.PD_SMOOTH|wx.PD_AUTO_HIDE)
    self.Start(self.DoWork, progress)
    progress.ShowModal()

def Start(func, *args):
    thread = threading.Thread(target=func, args=args)
    thread.setDaemon(True)
    thread.start()

def DoWork(self, progress):
    for i in range(101):
        ex.CallAfter(progress.Update, i)
        time.sleep(0.2)
    self.processSents()
    self.processWords()
    self.repSents()
    self.measSim()
    self.selCont()
    wx.CallAfter(progress.Destroy)
到目前为止,我看到的解决方案是:

任何帮助或建议都将不胜感激,因为我非常迷茫:(

谢谢

克里斯

更新至工作版本(根据Corley的建议,Jerry的回复与wx.Yield()相结合

def sum(self, event):
    progress = wx.ProgressDialog("sum in progress", "please wait", maximum=100, parent=self, style=wx.PD_SMOOTH|wx.PD_AUTO_HIDE)
    self.processSents()
    percent = 20
    progress.Update(percent)
    self.processWords()
    percent += 20
    progress.Update(percent)

    // repSends, measSim and selCont omitted to save space
    progress.Destroy()
从每个函数内调用wx.Yield(),例如

def processSents(self):
    // some long running process
    wx.Yield()
    // end of long running process
1) 单击按钮时将创建线程
DoWork

2) 在
DoWork
中,将创建另一个线程
showProgress
,以显示进度对话框

3) 在
DoWork
中,
doSomething
模拟一些耗时的事情

4) a在本示例中,每个
doSomething
之前将创建另一个线程
updateProgress
,以避免进度条冻结,但实际上您应该调用
self.progress.Update
求和进度时更新进度条

import wx
import threading
import  time

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None)
        panel = wx.Panel(self)
        btn1 = wx.Button(panel, label="test1")
        btn1.Bind(wx.EVT_BUTTON, self.onButton1)

        btn2 = wx.Button(panel, label="test2")
        btn2.Bind(wx.EVT_BUTTON, self.onButton2)

        sizer = wx.BoxSizer(wx.VERTICAL)

        sizer.Add(btn1)
        sizer.Add(btn2)

        panel.SetSizer(sizer)


        self.maxPercent = 100
        self.percent = 0

    def onButton1(self, evt):
        self.StartThread(self.DoWork1)

    def onButton2(self, evt):
        self.StartThread(self.DoWork2)

    def StartThread(self, func, *args):
        thread = threading.Thread(target=func, args=args)
        thread.setDaemon(True)
        thread.start()

    def showProgress(self):
        self.progress = wx.ProgressDialog("sum in progress", "please wait", maximum=self.maxPercent, parent=self, style=wx.PD_SMOOTH|wx.PD_AUTO_HIDE)

    def destoryProgress(self):
        self.progress.Destroy()

    def updateProgress(self, percent):
        keepGoing = True
        time.sleep(1)
        while keepGoing and self.percent < percent:
            self.percent += 1
            (keepGoing, skip) = self.progress.Update(self.percent)
            time.sleep(0.1)


    def doSomething(self, take_time, taskPercent, say_something):
        time.sleep(take_time)
        (keepGoing, skip) = self.progress.Update(taskPercent, say_something+" done!")


    def DoWork1(self):
        self.StartThread(self.showProgress)

        taskPercent = 25
        self.StartThread(self.updateProgress, taskPercent)
        self.doSomething(5, taskPercent, "1st")

        taskPercent +=25
        self.StartThread(self.updateProgress, taskPercent)
        self.doSomething(5, taskPercent, "2nd")

        taskPercent +=25
        self.StartThread(self.updateProgress, taskPercent)
        self.doSomething(5, taskPercent, "3rd")

        taskPercent +=25
        self.StartThread(self.updateProgress, taskPercent)
        self.doSomething(5, taskPercent, "4th")

        self.destoryProgress()

    def DoWork2(self):
        self.StartThread(self.showProgress)

        taskPercent = 25
        self.doSomething(5, taskPercent, "1st")

        taskPercent +=25
        self.doSomething(5, taskPercent, "2nd")

        taskPercent +=25
        self.doSomething(5, taskPercent, "3rd")

        taskPercent +=25
        self.doSomething(5, taskPercent, "4th")

        self.destoryProgress()


if __name__ == '__main__':

    app = wx.App(0)
    frame = MyFrame()
    frame.Show()
    app.MainLoop()
导入wx
导入线程
导入时间
类MyFrame(wx.Frame):
定义初始化(自):
wx.Frame.\uuuu init\uuuux(self,None)
面板=wx.面板(自)
btn1=wx.按钮(面板,标签=“test1”)
btn1.Bind(wx.EVT_按钮,self.onButton1)
btn2=wx.按钮(面板,标签=“test2”)
btn2.Bind(wx.EVT_按钮,self.onButton2)
sizer=wx.BoxSizer(wx.VERTICAL)
sizer.Add(btn1)
施胶剂添加(btn2)
面板设置器(施胶器)
self.maxPercent=100
self.percent=0
def ON按钮1(自身,evt):
self.StartThread(self.DoWork1)
def ON按钮2(自身,evt):
self.StartThread(self.DoWork2)
def StartThread(self、func、*args):
thread=threading.thread(target=func,args=args)
setDaemon(True)
thread.start()
def显示进度(自我):
self.progress=wx.ProgressDialog(“sum in progress”,“请稍候”,max=self.maxPercent,parent=self,style=wx.PD_SMOOTH | wx.PD_AUTO_HIDE)
def destoryProgress(self):
self.progress.Destroy()
def updateProgress(自身,百分比):
继续=正确
时间。睡眠(1)
当保持和自我时。百分比<百分比:
自身百分比+=1
(keepGoing,skip)=self.progress.Update(self.percent)
睡眠时间(0.1)
def doSomething(自我、花时间、任务百分比、说点什么):
时间。睡眠(花点时间)
(keepGoing,skip)=self.progress.Update(taskPercent,说某事+“完成!”)
def DoWork1(自身):
self.StartThread(self.showProgress)
百分比=25
self.StartThread(self.updateProgress,taskPercent)
自我剂量测定(5,百分之五,“第一”)
百分比+=25
self.StartThread(self.updateProgress,taskPercent)
自我剂量测定(5,百分之二,“第二”)
百分比+=25
self.StartThread(self.updateProgress,taskPercent)
自我剂量测定(5%,百分之三,“第三”)
百分比+=25
self.StartThread(self.updateProgress,taskPercent)
自我剂量测定(5%,百分之四,“第四”)
self.destoryProgress()
def DoWork2(自身):
self.StartThread(self.showProgress)
百分比=25
自我剂量测定(5,百分之五,“第一”)
百分比+=25
自我剂量测定(5,百分之二,“第二”)
百分比+=25
自我剂量测定(5%,百分之三,“第三”)
百分比+=25
自我剂量测定(5%,百分之四,“第四”)
self.destoryProgress()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=wx.app(0)
frame=MyFrame()
frame.Show()
app.MainLoop()

一个可能更简单的选择就是在代码中定期调用
wx.Yield()
;这允许GUI刷新/处理输入。当然,不会运行其他操作,但它确实允许进度条正确更新


进度条可能应该是全局的,或者传递给子功能,以便它可以随时更新进度。

感谢您的回复。我尝试了你的代码(没有更改),但在进度对话框关闭后,程序挂起,我无法再选择主窗口。我对第4点的理解正确吗?我认为我的代码应该是这样的:
def DoWork(self)self.StartThread(self.showProgress)taskPercent=25 self.progress.Update(taskPercent)self.processSents()
即删除updateProgress和doSomething方法?@chrisrs2292抱歉,应用程序挂起,因为我忘记破坏对话框。代码
中添加了另一个案例,但没有updateProgress
,您可以检查差异<代码>自我.进度.更新
将在每次
doSomething
结束时执行。谢谢,应用程序不再挂起,但由于某种原因,在代码完成执行之前,进度对话框现在关闭。我正在用一些最新的代码更新我的原始帖子。@chrisrs2292请尝试添加一些标志,如
wx.PD_APP_MODAL
,我现在无法运行代码,但我认为这是您需要的。嘿,Jerry,我尝试使用wx.PD_APP_MODAL,但在长时间运行的代码完成之前对话框仍然会自动关闭。所以我遇到的问题是,在selCont()函数中,我在文本控件中显示一些输出。但是progressDialog关闭了,然后应用程序就停了下来