如何使progressbar在python中工作?
想象一下,我想用这样的GUI制作一个简单的程序。 这是我的代码:如何使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
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)