我正在尝试使用GTK,但我发现信号文档(https://developer.gnome.org/gobject/stable/signal.html)很难理解.
似乎"信号"和"事件"之间存在差异.例如,Widget的"事件" - 信号的文档(https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget-event)说
GTK +主循环将为每个传递给窗口小部件的GDK事件发出三个信号:一个generic :: event信号,另一个更具体的信号,与所传递的事件类型相匹配(例如"按键事件"),最后一个通用的"事件后"信号.
所以在我看来,GDK使用"事件",而GTK +使用"信号".也许事件只是包含在信号中,反之亦然?或者他们是完全不同的东西?
我对上述引用的理解:当按下某个键时,会触发GDK事件.此GDK事件调用窗口小部件的回调函数(不是程序员干扰).然后,回调函数依次发出三个信号::event,key-press-event并且event-after一个接一个地发出.作为程序员,我可以通过编写回调函数来拦截这些信号.如果第一个::event信号的回调返回TRUE,那么第二个key-press-event信号不会被触发,否则就是.第三个event-after信号总是被触发.
我的理解是否正确?
此外,在文档中,有时信号由双冒号(::event)前置,有时它们不是(key-press-event和event-after).有什么不同?双结肠是什么意思?
我正在尝试运行以下程序:
import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst
Run Code Online (Sandbox Code Playgroud)
我正在得到:
Traceback (most recent call last):
File "application.py", line 2, in <module>
import gi
ModuleNotFoundError: No module named 'gi'
Run Code Online (Sandbox Code Playgroud)
我在使用python3的Mac Sierra(10.12.1(16B2555))中。
我已经安装了pygoject和gtk + 3(可以在这里看到):
(cv) ? ~/Documents/test
00:53 $ brew install pygobject3 --with-python3 gtk+3
Warning: pygobject3 3.24.1_1 is already installed
Warning: gtk+3 3.22.18 is already installed
Run Code Online (Sandbox Code Playgroud)
我的python来自我的virtualenv:
(cv) ?-1 ~/Documents/test
00:53 $ which python
/Users/myuser/.virtualenvs/cv/bin/python
(cv) ? ~/Documents/test
00:54 $ python --version
Python 3.6.1
Run Code Online (Sandbox Code Playgroud)
如果我尝试卸载gi来重新安装它(如我在Stack先前的一些回答中所见),我将得到:
(cv) ?-1 ~/Documents/test
00:55 $ …Run Code Online (Sandbox Code Playgroud) 我有一个模块,它使用 python“线程”进行并发,使用“信号”进行关闭钩子:
signal.signal(signal.SIGINT, self.shutdownhook)
Run Code Online (Sandbox Code Playgroud)
我有另一个使用 dbus 和 gobject 的模块
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
....
GObject.threads_init()
mainloop = GObject.MainLoop()
mainloop.run()
Run Code Online (Sandbox Code Playgroud)
当我单独运行它们时,它们都按预期运行并ctrl+c通过“KeyboardInterrupt”导致终止。
但是,当我将它们一起运行时,主循环终止但从未调用关闭挂钩 - 没有kill -9 pid.
有人可以解释为什么会发生这种情况,以及如何最好地集成这两个模型
这是一个工作示例,它突出了我的问题。我无法仅使用 CTRL+C 退出程序,并且在这种情况下也不会调用关闭挂钩。
import threading
import signal
import sys
from gi.repository import GObject
def runMainloop():
print('running mainloop')
mainloop.run()
def shutdown():
print('shutdown')
def readInput():
print('readInput')
print(sys.stdin.readline())
if __name__ == '__main__':
signal.signal(signal.SIGINT, shutdown)
signal.signal(signal.SIGTERM, shutdown)
GObject.threads_init()
mainloop = GObject.MainLoop()
mainloopThread = threading.Thread(name='mainloop', target=runMainloop)
mainloopThread.setDaemon(True)
mainloopThread.start()
print('started')
inputThread = threading.Thread(name='input', target=readInput)
inputThread.start()
print('started input')
Run Code Online (Sandbox Code Playgroud) 在PyGTK的信号文档是关于创造的信号很清楚,但我不能创建一个不带参数的信号.
我想要的是定义(如在示例中):
class MyGObjectClass(gobject.GObject):
__gsignals__ = {
"some-signal": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE),
}
Run Code Online (Sandbox Code Playgroud)
然后打电话:
self.emit('some-signal') # not passing any arguments
Run Code Online (Sandbox Code Playgroud)
目前我不能这样做,因为gsignal_new的第三个参数是必需的,并且不能是None.
如何在GObject/Gtk中获取某个类的类对象?例如,如果我的类是GtkSpinButton,我想获得代表该类的GtkSpinButtonClass实例.它是参数"class"
gtk_spin_button_class_init (GtkSpinButtonClass *class)
Run Code Online (Sandbox Code Playgroud)
它是存储虚函数的对象.当我有一个GtkSpinButton的实例时,我可以打电话
GtkSpinButtonClass *class = GTK_SPIN_BUTTON_GET_CLASS (instance)
Run Code Online (Sandbox Code Playgroud)
但是我没有实例.GTK_TYPE_SPIN_BUTTON给我类型id,数字,而不是类对象.知道如何获得实际的实例吗?
我正在寻找 GObject 备忘单,了解常见的 OOP 概念如何映射到 GObject 的设施。例如考虑:
AnyGObject *o;
o = anygobject_new();
Run Code Online (Sandbox Code Playgroud)
现在,约定是什么...
说明:GObject 参考手册和GObject HowTo详细解释了如何创建新类(类结构、对象结构、私有结构、各种宏、约定)。将这些设施结合在一起就可以实现 OOP。然而似乎没有关于如何一致使用它们的教程。
我正在尝试在我的 Ubuntu 14.04 上安装 totem-pl-parser-3.10.7,在autogen.sh+configure成功结束后,我使用make. 但我收到以下错误:
Couldn't find include 'GObject-2.0.gir' (search path: ['.', '.', '/usr/share/gnome-fallback/gir-1.0', '/usr/share/gnome/gir-1.0', '/usr/local/share/gir-1.0', '/usr/share/gir-1.0', '/usr/share/gir-1.0', '/usr/share/gir-1.0', '/usr/share/gir-1.0'])
Run Code Online (Sandbox Code Playgroud)
在谷歌上搜索可能的原因,发现gobject-introspection是在 之后安装了软件包libglib-2.0-dev,因此.gir无法正确找到存储库。
另外,我删除了libglib-2.0-dev( apt remove --purge) 并重新安装了它,但错误仍然相同。
有什么建议吗?
我有一个基于 D-Bus 事件执行操作的 Python 脚本,其简化版本:
import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject
DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()
# Initialize a main loop
mainloop = gobject.MainLoop()
bus.add_signal_receiver(cb_udisk_dev_add, signal_name='DeviceAdded', dbus_interface="org.freedesktop.UDisks")
bus.add_signal_receiver(cb_udisk_dev_rem, signal_name='DeviceRemoved', dbus_interface="org.freedesktop.UDisks")
mainloop.run()
Run Code Online (Sandbox Code Playgroud)
这将调用 cb_udisk_dev_add 和 -rem 回调函数。现在我想要一个定时回调函数,我喜欢调用它,比如每 5 分钟调用一次。
看来 mainloop.run() 是一个被阻止的函数,所以我想我需要向主循环添加一个计时器......?
我尝试实现一些定期执行的函数: Executing periodal actions in Python ,但它们也都是阻塞的,所以 mainloop.run() 不会被执行。
有什么建议么?
我读了关于 gobject 的维基百科页面,上面写着:
仅依赖于 GLib 和 libc,GObject 是 GNOME 的基石,并在 GTK、Pango、ATK 中使用
但是此GLib API 参考页在其依赖项中列出了 GObject,此GObject API 参考页在其依赖项中列出了 GLib
如果维基百科页面上的内容属实,那么它们之间的依赖关系如何?它不应该只存在于 GObject 的依赖项下而不是 GLib 依赖项下吗?
我很困惑什么取决于什么,或者它们是否相互依赖?如果是,怎么办?
我开始研究 Glib 信号。在我的场景中,我想将一个类的多个实例连接到一个信号,如果这些实例之一调用 g_signal_emit(...),则应该为该类的所有实例调用提供的回调函数。让我尝试用一个例子来解释这一点。
\n\n我尝试创建 A 类的两个实例(A0 和 A1)。\nA 类在其_class_init函数中注册了一个非常简单的信号。
\n\n file_signals[0] = g_signal_newv("a_signal",\n G_TYPE_FROM_CLASS(ACLASS),\n G_SIGNAL_ACTION,\n NULL /* closure */,\n NULL /* accumulator */,\n NULL /* accumulator data */,\n NULL /* C marshaller */,\n G_TYPE_NONE /* return_type */,\n 0 /* n_params */,\n NULL); /* argument types*/\nRun Code Online (Sandbox Code Playgroud)\n\n然后,我将实例 A0 和 A1 的简单回调函数 (cb_a) 连接到信号“a_signal”。(例如在_instance_init函数中)
\n\ng_signal_connect(A0, "a_signal", (GCallback)cb_a, NULL);\ng_signal_connect(A1, "a_signal", (GCallback)cb_a, NULL); ,\nRun Code Online (Sandbox Code Playgroud)\n\n其中 cb_a 是 Ac 中定义的函数:
\n\nstatic void cb_a(void)\n{\nprintf("cb_a called!\\");\n}\nRun Code Online (Sandbox Code Playgroud)\n\n …