- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让我的 GTK 应用响应网络连接状态的变化。我的方法就是我在问题中所说的:Listen on a (NetworkManager) DBus signal。
我有一个 python3 GTK 应用程序(一个非常小的应用程序,我应该补充一下),使用 python-gi。据我所知,由于 python-dbus(又名“import dbus”)已被弃用,我想通过 python-gi 使用 Gio。
我有一个较旧的脚本,它在系统 DBus 上监听我感兴趣的信号,该脚本使用“import dbus”和此代码:
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()
bus.add_signal_receiver(NMSignalHandler,
dbus_interface=NM_INTERFACE,
signal_name='StateChanged')
(后面跟着一个 gobject.MainLoop().run())
我认为“移植”到 Gio 会相对简单,但即使阅读了两个小时的文档,我也不知道该怎么做。任何帮助将不胜感激。
我已经尝试使用 Gio.NetworkMonitor.get_default() 及其“网络已更改”信号,但它似乎报告 net_available(第二个参数)始终为真,并且默认监视器似乎没有报告合理的结果要么。
如果有任何帮助,我将不胜感激。
最佳答案
要使用 python-gi 执行与 python-dbus 脚本相同的操作,以下对我有用:
from gi.repository import GLib, Gio
def network_changed_hndlr(network_monitor, network_available):
print(network_monitor)
print(network_available)
default = Gio.NetworkMonitor.get_default()
default.connect('network-changed', network_changed_hndlr)
mainloop = GLib.MainLoop()
try:
mainloop.run()
except KeyboardInterrupt:
mainloop.quit()
这是使用位于以下位置的文档: https://lazka.github.io/pgi-docs/Gio-2.0/structs/NetworkMonitor.html
NetworkManager
有更多的对象路径和接口(interface)。
例如,如果我看一下这个的输出busctl tree org.freedesktop.NetworkManager
我可以监控 48 个项目。
如果我想监控事件连接的输出,它将是:
from gi.repository import GLib, Gio
ACTIVE_IFACE = 'org.freedesktop.NetworkManager.Connection.Active'
def active_network_hndlr(dbus_proxy, properties_changed, properties_removed):
props = properties_changed.unpack()
print(props)
def network_proxy(connection):
"""
Provide proxy for comfortable and pythonic method calls
"""
return Gio.DBusProxy.new_for_bus_sync(
bus_type=Gio.BusType.SYSTEM,
flags=Gio.DBusProxyFlags.NONE,
info=None,
name='org.freedesktop.NetworkManager',
object_path=connection,
interface_name=ACTIVE_IFACE,
cancellable=None)
net_mngr = network_proxy('/org/freedesktop/NetworkManager/ActiveConnection/8')
net_mngr.connect('g-properties-changed', active_network_hndlr)
mainloop = GLib.MainLoop()
try:
mainloop.run()
except KeyboardInterrupt:
mainloop.quit()
使用 DBusProxy
完成大部分繁重的工作。这记录在: https://lazka.github.io/pgi-docs/Gio-2.0/classes/DBusProxy.html
关于python - 如何在 GTK(python 3、Gio)应用程序中监听 DBus 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51900869/
我正在尝试构建 glib-networking-2.40.1。我在制作步骤时遇到问题。 配置步骤 ~/gstreamer/plugins/recommended/good/glib-networkin
我想创建一个使用 GIO 通过套接字进行通信的服务器和客户端应用程序。 GSocketService 和 GSocketClient 似乎非常适合此目的,但不幸的是我找不到一些教程或示例代码(GLib
我正在使用 GTK 创建一个简单的文件查看器,并且我想异步加载新目录,以防止加载时挂起整个程序。 在GIO API中有一个g_file_enumerator_next_files_async函数,它允
在 Windows 7 上运行 Python 3.4,Gio.MemoryInputStream 的 close 函数没有释放内存,而它应该释放内存。测试代码是: from gi.repository
我需要打开一个文件来读取内容并将其内容显示在屏幕上。这应该使用 GIO 文件处理来完成。我正在阅读本教程,但作为练习,我需要使用 GIO 的代码来编写以下 C 代码。在 c 中,程序可以是: #inc
文档说所有移动到回收站的文件都正常存储在 ~/.local/share/Trash/files 中。从可移动媒体中删除的文件是否有异常(exception)?它们是否存储在 drive_root/.T
我在 Gtk3 应用程序中使用 Gio 操作制作了菜单。菜单项创建为: #in main file MenuElem = menu.MenuManager # Open Menu action = G
我成功编译了下面的程序simple.cc: #include int main (int argc, char *argv[]) { Glib::RefPtr app = Gtk::Ap
我正在尝试创建一个 Gio.SimpleAction 并连接到它的 change-state 信号,以便在状态更改时采取特定操作,但我失败了想出一个工作代码。 这是我已经尝试过(并期望有效)但没有成功
我正在尝试在此处编译 GIO 示例程序代码 developer.gnome.org关联。我用来编译它的命令是 g++ gdbserver.cpp `pkg-config glib-2.0 --
我使用的是 VC++ 2008,我有代码: #include int main( int argc, char *argv[]) { GtkWidget *window; gtk_init(
我正在尝试对根文件系统目录进行文件监控。我使用 g_file_new_for_path() 和 / 作为路径,并使用 g_file_monitor() 创建监视器。但在执行时没有报告任何事件。如果我使
以非阻塞方式逐 block 处理 GInputStream 的正确(GIO/Glib/GTK/Gnome)方法是什么? 我有一个应用程序正在下载(通过 libsoup)并分块处理数据流并并行执行其他操
我找到了一些更改颜色的链接,但它不起作用:Change the color of a Three.js globe我需要使用 http://gio.js 将地球的颜色从黑色更改为白色 我尝试使用以下代
我正在尝试使用 gio 设置徽章 #include #include #include #include #include int main (int argc, char *argv[])
我正在尝试使用 GIO .我想出了如何使用 GVolumeMonitor 来捕获音量变化并获取音量列表。 g_volume_monitor_get_mounts 函数为我提供了现有 GMount 的列
我想创建一个异步服务器和客户端应用程序,它们使用 GIO 通过套接字进行通信。由于我是 GIO 的新手,在浏览时我得到了以下代码——这是我的客户。我找不到服务器的任何示例。请在这方面指导我。 GMai
我在 Windows 7 中使用 GTK3、codeblcks IDE、glade3... 在我的应用程序中,我有一个按钮,单击该按钮会打开一个 gtk_file_chooser_dialog...但
关于为 gtkmm 运行以下 simple.cc 示例 #include int main(int argc, char * argv[]){ Glib::RefPtr app = Gt
我当前有一个同步 UDP 应用程序接收消息。 代码: #include #include #include #include #include int main(argc,argv) int
我是一名优秀的程序员,十分优秀!