python - 在 Python MDI 应用程序中结束 GTK+ 主循环

标签 python gtk pygtk mdi

我正在尝试编写一个由各种窗口(例如,通用消息对话框、登录对话框、主界面等)组成的应用程序,但在获取 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/

相关文章:

c - GtkTreeView 将选择设置为特定行

c - Gtk+ 编程风格 : defining widgets

python - 删除 gtk.Table 中的小部件?

python - 如何使用 Python Popen 处理多个参数?

python - 使用 Py2Exe、PyGtk 和 Glade 时缺少 dll

python - 如何有效地将条件应用于 numpy 数组的索引?

python - 如何将节点放置在特定位置 - networkx

python - 如何在 gtk 的 GtkDialog 中按下转义键时禁用销毁?

python - 按轴 0 中的单列组合 pandas DataFrame

python - 使用 python 从 XML 中提取文本