Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 23, 2010 14:55:47

Voland
От:
Зарегистрирован: 2009-03-06
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

PyGTK и обновление интерфейса

Наткнулся на проблему с обновлением интерфейса при выполнении команды 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



Офлайн

#2 Июнь 28, 2010 23:03:16

ilya1
От:
Зарегистрирован: 2010-06-28
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

PyGTK и обновление интерфейса

Такова природа os.system() - он все блокирует.
Вам надо subprocess.Popen() + ждать пока процесс не закончит работать (через glib.child_watch_add()), а до тех пор делать то, что
вы напитали

while gtk.events_pending():
gtk.main_iteration(False)



Офлайн

#3 Июнь 29, 2010 11:11:43

ilya1
От:
Зарегистрирован: 2010-06-28
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

PyGTK и обновление интерфейса

Пардон, за suprocess.Popen() не уверен, я использую glib.spawn_async() для работы в паре glib.child_watch_add()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version