我正在尝试制作一个简单的Unix桌面应用程序,它使用pynotify通知系统向用户显示一些警报,并允许他们从放置在警报上的按钮启动相关应用程序。
以下是相关的简化代码:
这段话的意思是:“这个功能很好(它会显示一个通知弹窗,其中有一个“操作”按钮,当激活时可以触发ls /命令),直到我实际尝试将通知部分放入循环中(我需要定期轮询服务器以获取通知,然后显示)。我已经尝试过这样做:”
由于某些原因,单击“Action”按钮时,“action_callback”函数不再被调用。
似乎这是我使用Gtk主循环的方式存在问题。像这样做可以使函数实际被触发:
当然,这不是一个正确的解决方案,我很快就会收到一个“超出最大递归深度”的Python RuntimeError。但是它表明改变gtk.main()调用的位置是有影响的。
我尝试查看关于主循环的Gtk和Pygtk文档,但最终没有找到解决方案。
所以我的问题是:什么是正确的做法,背后的逻辑是什么?
简而言之,如果我不将gtk.main()放在显示通知的同一函数中,当应该触发action_callback函数时,它就不会被触发。由于这个函数需要放在gtk主循环中,我就陷入了让gtk主循环调用自身或者action_callback函数不被触发的困境中。
提前感谢您的任何帮助;)
以下是相关的简化代码:
import subprocess, pynotify, gobject, gtk
class Notifier():
def __init__(self):
pynotify.init('Notifications')
n = pynotify.Notification("Some stuff")
n.add_action("action", "Action", self.action_callback)
n.show()
gtk.main()
def action_callback(self, n, action):
subprocess.Popen(['ls', '/'])
if __name__ == '__main__':
Notifier()
这段话的意思是:“这个功能很好(它会显示一个通知弹窗,其中有一个“操作”按钮,当激活时可以触发ls /命令),直到我实际尝试将通知部分放入循环中(我需要定期轮询服务器以获取通知,然后显示)。我已经尝试过这样做:”
import subprocess, pynotify, gobject, gtk
class Notifier():
def __init__(self):
pynotify.init('Notifications')
gobject.timeout_add(0, self.main)
gtk.main()
def action_callback(self, n, action):
subprocess.Popen(['ls', '/'])
def main(self):
n = pynotify.Notification("Some stuff")
n.add_action("action", "Action", self.action_callback)
n.show()
gobject.timeout_add(10000, self.main)
if __name__ == '__main__':
Notifier()
由于某些原因,单击“Action”按钮时,“action_callback”函数不再被调用。
似乎这是我使用Gtk主循环的方式存在问题。像这样做可以使函数实际被触发:
import subprocess, pynotify, gobject, gtk
class Notifier():
def __init__(self):
pynotify.init('Notifications')
self.main()
def action_callback(self, n, action):
subprocess.Popen(['ls', '/'])
def main(self):
n = pynotify.Notification("Some stuff")
n.add_action("action", "Action", self.action_callback)
n.show()
gobject.timeout_add(10000, self.main)
gtk.main()
if __name__ == '__main__':
Notifier()
当然,这不是一个正确的解决方案,我很快就会收到一个“超出最大递归深度”的Python RuntimeError。但是它表明改变gtk.main()调用的位置是有影响的。
我尝试查看关于主循环的Gtk和Pygtk文档,但最终没有找到解决方案。
所以我的问题是:什么是正确的做法,背后的逻辑是什么?
简而言之,如果我不将gtk.main()放在显示通知的同一函数中,当应该触发action_callback函数时,它就不会被触发。由于这个函数需要放在gtk主循环中,我就陷入了让gtk主循环调用自身或者action_callback函数不被触发的困境中。
提前感谢您的任何帮助;)