标签: gobject

在GTK中,"信号"和"事件"之间有什么区别?

我正在尝试使用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-eventevent-after).有什么不同?双结肠是什么意思?

gtk gobject

4
推荐指数
1
解决办法
1903
查看次数

ModuleNotFoundError:没有名为“ gi”的模块-Python-OsX

我正在尝试运行以下程序:

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 macos gobject gstreamer pygobject

4
推荐指数
2
解决办法
4042
查看次数

python gobject.mainloop gobbles 信号事件

我有一个模块,它使用 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)

python dbus gobject

4
推荐指数
1
解决办法
2790
查看次数

如何在pygtk中创建没有参数的gsignal

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.

python signals pygtk gobject pygobject

3
推荐指数
1
解决办法
666
查看次数

获取GObject类型的类结构实例

如何在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,数字,而不是类对象.知道如何获得实际的实例吗?

gtk gobject

3
推荐指数
1
解决办法
565
查看次数

GObject OOP 语法

我正在寻找 GObject 备忘单,了解常见的 OOP 概念如何映射到 GObject 的设施。例如考虑:

AnyGObject *o;
o = anygobject_new();
Run Code Online (Sandbox Code Playgroud)

现在,约定是什么...

  • 调用一个方法
  • 调用基类声明的方法
  • 调用该类正在实现的接口声明的方法
  • 调用类方法
  • 调用基类声明的类方法
  • 调用虚方法
  • 转换为基类
  • 转换为派生类
  • 转换为类正在实现的接口
  • 测试对象是否属于特定类型
  • ...

说明:GObject 参考手册GObject HowTo详细解释了如何创建新类(类结构、对象结构、私有结构、各种宏、约定)。将这些设施结合在一起就可以实现 OOP。然而似乎没有关于如何一致使用它们的教程。

c gtk oop gobject

3
推荐指数
1
解决办法
1275
查看次数

找不到包含“GObject-2.0.gir”

我正在尝试在我的 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) 并重新安装了它,但错误仍然相同。

有什么建议吗?

ubuntu gobject glib gobject-introspection

3
推荐指数
1
解决办法
2945
查看次数

python mainloop,添加定时事件

我有一个基于 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() 不会被执行。

有什么建议么?

python gobject timer

3
推荐指数
1
解决办法
2017
查看次数

gobject 依赖于 glib 还是 glib 依赖于 gobject?

我读了关于 gobject 的维基百科页面,上面写着:

仅依赖于 GLib 和 libc,GObject 是 GNOME 的基石,并在 GTK、Pango、ATK 中使用

但是此GLib API 参考页在其依赖项中列出了 GObject,此GObject API 参考页在其依赖项中列出了 GLib

如果维基百科页面上的内容属实,那么它们之间的依赖关系如何?它不应该只存在于 GObject 的依赖项下而不是 GLib 依赖项下吗?

我很困惑什么取决于什么,或者它们是否相互依赖?如果是,怎么办?

gtk dependencies gobject glib

3
推荐指数
1
解决办法
142
查看次数

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*/\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,我将实例 A0 和 A1 的简单回调函数 (cb_a) 连接到信号“a_signal”。(例如在_instance_init函数中)

\n\n
g_signal_connect(A0, "a_signal", (GCallback)cb_a, NULL);\ng_signal_connect(A1, "a_signal", (GCallback)cb_a, NULL); ,\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中 cb_a 是 Ac 中定义的函数:

\n\n
static void cb_a(void)\n{\nprintf("cb_a called!\\");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n …

signals gobject callback glib

2
推荐指数
1
解决办法
644
查看次数