如何让进度条在python中运行?

时间:2013-06-03 06:48:51

标签: python model-view-controller gtk progress-bar

想象一下,我想用这样的GUI创建一个简单的程序。 http://i44.tinypic.com/migjgm.png

这是我的代码:

from gi.repository import Gtk
import gobject

class gui():
    def __init__(self):
        self.window = Gtk.Window()
        self.window.connect('delete-event', Gtk.main_quit)

        self.box = Gtk.Box()
        self.window.add(self.box)

        self.progressbar = Gtk.ProgressBar()
        self.box.pack_start(self.progressbar, True, True, 0)

        self.button = Gtk.Button(label='Start')
        self.button.connect('clicked', self.on_button_clicked)
        self.box.pack_start(self.button, True, True, 0)

        self.window.show_all()
        Gtk.main()

    def on_button_clicked(self, widget):
        self.task = self.iters(100000)
        gobject.idle_add(self.task.next)

    def iters(self, j):
        i = j
        while i > 0 :
            i -= 1
            print i
            self.progressbar.set_fraction((j - float(i)) / j)
            yield True
        yield False

if __name__ == '__main__':
    gui = gui()

如果我将所有内容放在一个这样的脚本中,我知道如何使进度条工作。 但是,如果我想将gui部分与逻辑部分分开怎么办?所以,它会是这样的:

GUI.py

from gi.repository import Gtk

class gui():
    def __init__(self):
        self.window = Gtk.Window()
        self.window.connect('delete-event', Gtk.main_quit)

        self.box = Gtk.Box()
        self.window.add(self.box)

        self.progressbar = Gtk.ProgressBar()
        self.box.pack_start(self.progressbar, True, True, 0)

        self.button = Gtk.Button(label='Start')
        self.button.connect('clicked', self.on_button_clicked)
        self.box.pack_start(self.button, True, True, 0)

        self.window.show_all()
        Gtk.main()

    def on_button_clicked(self, widget):
        //how to implement it

if __name__ == '__main__':
    gui = gui()

Iteration.py

class Iteration():
def iters(self, j):
    i = j
    while i > 0 :
        i -= 1
        print i

修改 还有一件事,上面的第一个代码可以工作,但为什么我会收到这条消息:

/usr/lib/python2.7/dist-packages/gobject/constants.py:24: Warning: g_boxed_type_register_static: assertion `g_type_from_name (name) == 0' failed
import gobject._gobject

修改 好吧,想象我有一个像这样的模块: Works.py

def getImageFromInternet(uri):
    #some code to get image from internet

getImageFromInternet函数不可迭代。我想要做的是在后台处理此功能,同时更新进度条并使用gui执行其他操作。我需要一个线程吗?

1 个答案:

答案 0 :(得分:0)

创建一个生成器,用于更新GUI并驱动基础数据模型生成器,并将其传递给idle_add。例如(未经测试):

    def on_button_clicked(self, widget):
        cnt = 10000
        task = self.iters(cnt)
        def gui_iter():
            for i, ignore in enumerate(task, 1):
                self.progressbar.set_fraction(i / cnt)
                yield True
            yield False
        gobject.idle_add(gui_iter().next)