Форум сайта python.su
Наткнулся на проблему с обновлением интерфейса при выполнении команды os.system(). У меня на форме есть прогрессбар, который должен пульсировать, пока выполняется os.system() Добавлял
while gtk.events_pending():
gtk.main_iteration(False)
self.pages = self.builder.get_object("pagesspinbutton")
pagescount = self.pages.get_value_as_int()
self.progressbar = self.builder.get_object("progressbar")
tmpfile = filepath + "/book.ps"
workingfile = string.replace(filename,".pdf","") + ".ps"
outputfile = string.replace(filename,".pdf","") + "_booklet.pdf"
command_list = ('pdf2ps \"%s\" \"%s\"' %(filename, workingfile),
'psbook -s%d \"%s\" \"%s\"' %(pagescount, workingfile, tmpfile),
'psnup -2 -P a5 -p a4 \"%s\" > \"%s\"' %(tmpfile, workingfile),
'ps2pdf \"%s\" \"%s\"' %(workingfile, outputfile),
'rm -f \"%s\" \"%s\"' %(tmpfile, workingfile)
)
message_list = ('Converting into PostScript...',
'Making broshures...',
'Creating booklet...',
'Converting into PDF...',
'Job has been done...'
)
if (pagescount % 4 != 0):
self.builder.get_object("hbox7").show()
else:
self.builder.get_object("makebutton").set_sensitive(0)
for i in range(len(command_list)):
self.progressbar.set_text(message_list[i])
keep_pulsing = True
gobject.timeout_add(200, do_pulse)
print "Executing command: %s" %command_list[i]
os.system(command_list[i])
while gtk.events_pending():
gtk.main_iteration(False)
keep_pulsing = False
self.progressbar.set_fraction(0)
def do_pulse(self,*args):
global keep_pulsing
if keep_pulsing:
self.progressbar.pulse()
return True
return False
Офлайн
Такова природа os.system() - он все блокирует.
Вам надо subprocess.Popen() + ждать пока процесс не закончит работать (через glib.child_watch_add()), а до тех пор делать то, что
вы напитали
while gtk.events_pending():
gtk.main_iteration(False)
Офлайн
Пардон, за suprocess.Popen() не уверен, я использую glib.spawn_async() для работы в паре glib.child_watch_add()
Офлайн