如何使progressbar在python中工作?

如何使progressbar在python中工作?,python,model-view-controller,gtk,progress-bar,Python,Model View Controller,Gtk,Progress Bar,想象一下,我想用这样的GUI制作一个简单的程序。 这是我的代码: 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() s

想象一下,我想用这样的GUI制作一个简单的程序。

这是我的代码:

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()
如果我把所有的东西都放在一个脚本中,我知道如何让progressbar工作。 但是,如果我想将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()
迭代.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


getImageFromInternet
函数不可使用。我想做的是在后台处理这个函数,同时更新progressbar并使用gui做其他事情。我需要一个线程吗?

创建一个更新GUI并驱动底层数据模型生成器的生成器,并将其传递给
idle\u add
。例如(未经测试):


不适合我。这就是我得到的:
第21行,正在为i进行,在枚举(t,1)中忽略:TypeError:'NoneType'对象不可iterable
@user2435611我现在才注意到您的
iters()
不是迭代器。为什么不呢?这只是一个示例,因为真正的任务是不可移植的。@user2435611那么,为什么不让它可移植呢?您声明的目标是将数据模型与用户界面分离,这是通过所示的设计实现的(dm中没有用户界面代码)。如果您的代码不可编辑,那么转换以显示进度将非常困难。下一步要尝试的是在线程中运行它。想象一下,我有一个类,它有一个函数,它在做如此繁重的工作,这是不可移植的。所以,我不能用idle_add()完成它?
def getImageFromInternet(uri):
    #some code to get image from internet
    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)