我正在编写一个 Python + GObject 应用程序,它需要在启动时从磁盘读取大量数据。数据是同步读取的,大约需要10秒才能完成读取操作,在此期间UI的加载会有延迟。
我想异步运行任务,并在它准备好时收到通知,而不会阻塞 UI,或多或少像:
def take_ages():
read_a_huge_file_from_disk()
def on_finished_long_task():
print "Finished!"
run_long_task(task=take_ages, callback=on_finished_long_task)
load_the_UI_without_blocking_on_long_task()
Run Code Online (Sandbox Code Playgroud)
我过去曾将GTask用于此类事情,但我担心它的代码已经 3 年没有被触及,更不用说移植到 GObject Introspection 了。最重要的是,它在 Ubuntu 12.04 中不再可用。所以我正在寻找一种简单的方法来异步运行任务,无论是标准 Python 方式还是 GObject/GTK+ 标准方式。
编辑:这是一些代码,其中包含我正在尝试执行的操作的示例。我已经python-defer按照评论中的建议进行了尝试,但是我无法异步运行长任务并让 UI 加载而不必等待它完成。浏览测试代码。
是否有一种简单且广泛使用的方式来运行异步任务并在它们完成时得到通知?
我已经将一些 Python 代码转换为使用 PYGI,但我不知道如何转换这一行:
gtk.timeout_add(PING_FREQUENCY * 1000, self.doWork)
Run Code Online (Sandbox Code Playgroud)
明确地说,由于我真的不知道 PYGTK 和 PYGI 之间的区别,我的新代码使用
from gi.repository import Gtk
from gi.repository import AppIndicator3 as appindicator
Run Code Online (Sandbox Code Playgroud)
如此处所示https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version
我试图转换的完整代码在这里http://pastebin.com/raw.php?i=aUtASRpy
相当于什么
gtk.timeout_add(PING_FREQUENCY * 1000, self.doWork)
Run Code Online (Sandbox Code Playgroud)
在 PYGI 中?
我还假设 PYGI 是制作统一指标的最现代方式
我还假设最好让指标检查某物的状态,而不是让某物告诉指标状态(推 vs 拉)。让python程序每秒检查一些东西是否可以?
谢谢!
我正在编写一个基于选项卡的 Python 应用程序,我不希望它有任何额外的弹出对话框。
我想使用该Gtk.AboutDialog功能,但不希望它显示为单独的窗口。相反,我希望将它嵌入到我的Gtk.Notebook(我用 Glade 创建的)选项卡之一中。
我找不到任何明显的方法来做到这一点。有没有人有任何指示?
我在 Glade 创建了一个空框来添加一个 Notebook。我没有在 Glade 中添加实际 Notebook 的原因是因为我听说您无法在 Glade 中添加页面到 Notebook 中。
因此,在 Glade 中,我在 VBox 的空槽中创建了一个 Box。我正在运行的代码是:
self.box = self.builder.get_object("box")
self.subjects = Gtk.Notebook()
self.box.add(self.subjects)
Run Code Online (Sandbox Code Playgroud)
运行时没有任何反应,除了我相信无论如何都会发生的这些警告:
/usr/lib/python2.7/dist-packages/gi/overrides/Gtk.py:391: Warning: g_object_set_property: construct property "type" for object `Window' can't be set after construction
Gtk.Window.__init__(self, type=type, **kwds)
/usr/lib/python2.7/dist-packages/gi/overrides/Gtk.py:391: Warning: g_object_set_property: construct property "type" for object `NotetakerWindow' can't be set after construction
Gtk.Window.__init__(self, type=type, **kwds)
Run Code Online (Sandbox Code Playgroud) 我将 Ubuntu 12.04 与 python 2.7.3 和 PyGObject 一起使用,我想在 python 中为 Gedit 开发插件。我在这里找到了有关此类事情的简单教程。
根据教程,我需要Gedit模块与插件界面交互:
from gi.repository import GObject, Gedit
Run Code Online (Sandbox Code Playgroud)
尝试导入 Gedit 模块时,我不断收到导入错误。所以,我的问题是:我需要安装什么包才能获得这个模块?
我试过:gedit-dev,gedit-plugins
编辑:这是上述语句的完整回溯:
ERROR:root:Could not find any typelib for Gedit
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name Gedit
Run Code Online (Sandbox Code Playgroud) 我正在使用 Python + PyGObject 创建一个 Unity AppIndicator,但我希望它的图标是标准的 Ubuntu 风格。我在哪里可以找到使用颜色的适当指南(或者它只是白色/透明?),或者至少是标准 AppIndicators 的图标?那大约是 13.04,我想,在这个版本之后图标样式不会有太大变化(尽管我们会看到)。
另外,我有一个关于将我的图标设置为我的指标的问题。如果我把它和.py文件放在同一个文件夹中,我应该如何在代码中引用它?
我正在编写一个小应用程序,我想提交给 Ubuntu 应用程序审查委员会,我想做的一件事是让它在组合框中显示检测到的无线 SSID 的名称。这是一个 PyGI 应用程序。
有没有人知道我如何从系统中获取这些 SSID,最好是通过 Python API?来自 dbus?从网络管理器?
我正在使用 Quickly (PyGI) 为 Gnome/Ubuntu 编写 Notational Velocity 克隆,我希望允许用户设置一个全局快捷键,该快捷键将在应用程序运行时切换应用程序窗口的可见性(类似于 Tilda 为其所做的事情)终端模拟器)。即,一旦应用程序启动,用户可以按 F2 隐藏窗口,然后再次按 F2 使其可见并将其带到前面。我不想使用外部热键应用程序或任何需要应用程序外设置的东西。我该怎么办?
这里有一个类似的问题:How can I listen on global keypress event? 但主要的答案是一个笨拙的非程序化解决方案。一位评论者提到“通过 X api 调用抓住键盘”,但我不确定从哪里开始。
当您运行以下代码时,它将在窗口中显示一个内联工具栏。请注意内嵌工具栏如何具有突出的背景。有没有办法应用 CSS 来摆脱它并与常规窗口颜色混合?

#!/usr/bin/python3
from gi.repository import Gtk
button_names = [Gtk.STOCK_ABOUT, Gtk.STOCK_ADD, Gtk.STOCK_REMOVE, Gtk.STOCK_QUIT]
buttons = [Gtk.ToolButton.new_from_stock(name) for name in button_names]
toolbar = Gtk.Toolbar()
toolbar.set_show_arrow(False)
for button in buttons:
toolbar.insert(button, -1)
style_context = toolbar.get_style_context()
style_context.add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR)
grid = Gtk.Grid()
grid.add(toolbar)
label = Gtk.Label()
grid.add(label)
window = Gtk.Window()
window.set_size_request(200, 50)
window.add(grid)
window.connect('delete-event', Gtk.main_quit)
window.show_all()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)
使用andrewsomething代码,它开始看起来更好,但“边界”仍然存在并占用空间。请注意,在下面的屏幕截图中,左侧的工具栏比右侧的常规按钮小:

像 HTML 小部件和透明的 Webkit 窗口这样的简单解决方案将是理想的。
我正在尝试制作一个简单的背景小部件框架,以便我可以轻松地使用一些 CSS 小部件自定义我的桌面,而不必担心单独的未装饰的窗口会像在 setid unity 上的 screenlets 一样四处移动。
像这样的东西,但与 pygi 是我正在寻找的东西。