我正在尝试编写一个由各种窗口(例如,通用消息对话框、登录对话框、主界面等)组成的应用程序,但在获取 gtk.main_quit
函数时遇到了问题被调用:要么我收到关于调用在主循环之外的投诉,要么函数根本没有被调用。
我是 Python 和 GTK+ 的新手,但我对如何让它工作的最佳猜测是拥有一个“根”窗口,它只是一个从未见过的占位符,但控制着应用程序的 GTK+ 循环.到目前为止,我的代码如下:
import pygtk
pygtk.require("2.0")
import gtk
class App(gtk.Window):
_exitStatus = 0
# Generic message box
def msg(self, title, text, type = gtk.MESSAGE_INFO, buttons = gtk.BUTTONS_OK):
# Must always have a button
if buttons == gtk.BUTTONS_NONE:
buttons = gtk.BUTTONS_OK
dialog = gtk.MessageDialog(None, 0, type, buttons, title)
dialog.set_title(title)
dialog.set_geometry_hints(min_width = 300)
dialog.set_resizable(False)
dialog.set_deletable(False)
dialog.set_position(gtk.WIN_POS_CENTER)
dialog.set_modal(True)
dialog.format_secondary_text(text)
response = dialog.run()
dialog.destroy()
return response
def nuke(self, widget, data):
gtk.main_quit()
exit(self._exitStatus)
def __init__(self):
super(App, self).__init__()
self.connect('destroy', self.nuke)
try:
raise Exception()
except:
self.msg('OMFG!', 'WTF just happened!?', gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE)
self._exitStatus = 1
self.destroy()
if self.msg('OK', 'Everything worked fine') == gtk.RESPONSE_OK:
self.destroy()
# Let's go!
App()
gtk.main()
nuke
函数永远不会被调用,尽管显式调用了 destroy
。
DIFF 根据@DonQuestion 的建议:
- self.destroy()
+ self.emit('destroy')
- App()
+ app = App()
这并没有解决问题...
更新 接受@jku 的回答,但也可以查看我自己的回答以获取更多信息...
最佳答案
首先,代码有一点测试问题:您从 App 初始化调用 Gtk.main_quit():这发生在主循环运行之前,因此信号可能无法工作。
其次,您可能会在 destroy() 上收到警告:'destroy' 处理程序只接受两个参数(自身加一个),但您的有三个...
另外关于您对控制流的评论:您不需要 Window 来获取信号,因为它们是 GObject 功能。为了您的测试需要,您可以编写一个 App.test_except() 函数并在对象初始化中使用 glib.idle_add (self.test_except)
- 这样 test_except() 在主循环运行时被调用.
关于python - 在 Python MDI 应用程序中结束 GTK+ 主循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544090/