2015-07-03 2 views
1

Если я использую .set_text() и .set_fraction() методы от уровня модуля, все успешно.PyGObject: Невозможно управлять прогрессбар

Но если я это сделаю из функции или отправив объект другому модулю, ничего не произойдет.

Я использую Glade. Я написал программу в течение 5 минут. Glade:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.16.1 --> 
<interface> 
    <requires lib="gtk+" version="3.10"/> 
    <object class="GtkWindow" id="window1"> 
    <property name="can_focus">False</property> 
    <child> 
     <object class="GtkProgressBar" id="progressbar1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <property name="fraction">0.0</property> 
     <property name="pulse_step">0.10</property> 
     <property name="show_text">True</property> 
     </object> 
    </child> 
    </object> 
    <object class="GtkWindow" id="window2"> 
    <property name="can_focus">False</property> 
    <child> 
     <object class="GtkButton" id="button1"> 
     <property name="label" translatable="yes">button</property> 
     <property name="visible">True</property> 
     <property name="can_focus">True</property> 
     <property name="receives_default">True</property> 
     </object> 
    </child> 
    </object> 
</interface> 

Очень страшный сценарий Python:

from gi.repository import Gtk 
import time 

def go(*args): 
    progress.set_text("Progress...") 
    for did in range(100): 
     progress.set_fraction(did/100) 
     time.sleep(0.1) 

builder = Gtk.Builder() 
builder.add_from_file("test.glade") 
win = builder.get_object("window1") 
win2 = builder.get_object("window2") 
win.connect("destroy", Gtk.main_quit) 
progress = win.get_child() 
button = win2.get_child() 
button.connect("clicked", go) 
win.show_all() 
win2.show_all() 
Gtk.main() 

UPD1: Мои шаги:

  1. Я нажатием кнопки
  2. proggressbar пребывания в старой позиции
  3. Когда цикл завершен, обновленная панель прогресса тес

UPD2:video

+1

Ваша основная проблема заключается в том, что вы не увеличиваете 'did' в своем цикле, также что вы выполняете целочисленное деление, которое всегда будет оцениваться до нуля, а' did <100'. Измените на '(did/100.0)', чтобы заставить float. Это все равно не будет обновлять progbar до конца, хотя вам нужно использовать 'idle_add', возможно, для этого. – SiHa

+0

@SiHa, я использую Python3 –

+0

Хорошо, что будет увеличиваться, не сообщая об этом? – SiHa

ответ

1

Вы запустили свой цикл прогрессии в пределах GTK основного цикла. Поэтому вы блокируете основной цикл, и вся перерисовка задерживается до завершения цикла.

Вы можете увидеть это с помощью threading модуля, как следующее:

button.connect("clicked", lambda *a: threading.Thread(target=go, args=a).start()) 

На этот раз обновления progessbar работать.

+0

Это правда, за исключением того, что Gtk не является потокобезопасным. Используя что-то наподобие 'timeout_add', вы можете повторять вызовы для обновления панели прогресса. – TingPing

+0

Пожалуйста, избегайте использования потоков, как уже упоминалось, существуют определенные функции для достижения тех же результатов. – gianmt