python - PyGObject:无法控制进度条

标签 python python-3.x pygobject

如果我在模块级别使用 .set_text().set_fraction() 方法,则全部成功。

但是如果我从函数或通过将对象发送到其他模块来执行此操作,则不会发生任何情况。

我使用格莱德。我写了一个程序,花了5分钟。林间空地:

<?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. 进度条停留在旧位置
  3. 循环完成后,进度条更新

UPD2: video

最佳答案

您正在 gtk 主循环中运行进度循环。因此,您将阻塞主循环,并且所有重绘都会延迟,直到循环完成。

您可以使用threading模块来查看这一点,如下所示:

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

这次进度条更新工作了。

关于python - PyGObject:无法控制进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31206079/

相关文章:

python - 每当单元测试失败时执行操作

python - 如何更改 GTK 容器小部件的大小?

python - 找出所有的方法来决定 list 分为三

python - 从对象重建源

python - 使用 Python 和 Gtk+ 3 导入错误

python - 如何使用 Gio 设置 HTTP 请求的用户代理?

python - Pandas 循环优化

python - 在python中以特殊格式打印文件中的列表

python - 如何计算不包括圆列表的图像的方差

Python:将 errno 映射到 OSError 的子类