'Close window' 使用 tkinter + gobject 时按钮不起作用

'Close window' button wont work when using tkinter + gobject

我的 tkinter 应用程序运行良好,但要实现 dbus 功能,我必须使用 gobject。一切正常,除了 运行 tkinter 和 gobject 的主循环使标准 window 管理器中的 "close window" 按钮(window 中的 'x' 按钮接口)不工作。 :/ 其他一切正常,包括调整大小、minimizing/maximizing、恢复和移动 window。

感谢任何帮助,

谢谢,


小代码片段:

import dbus
from dbus.service import Object
from dbus.mainloop.glib import DBusGMainLoop

class TBOPlayerDBusInterface (Object):
    tboplayer_instance = None

    def __init__(self, tboplayer_instance):
        self.tboplayer_instance = tboplayer_instance
        dbus_loop = DBusGMainLoop()
        bus_name = dbus.service.BusName("org.tboplayer.TBOPlayer", bus = dbus.SessionBus(mainloop = dbus_loop))
        Object.__init__(self, bus_name, "/org/tboplayer/TBOPlayer")

    @dbus.service.method('org.tboplayer.TBOPlayer', in_signature = 'as')
    def openFiles(self, files):
        self.tboplayer_instance._add_files(files)

# ***************************************
# MAIN
# ***************************************

if __name__ == "__main__":
    datestring=" 28 Fev 2017"

    dbusif_tboplayer = None
    try:
        bus = dbus.SessionBus()
        bus_object = bus.get_object("org.tboplayer.TBOPlayer", "/org/tboplayer>/TBOPlayer", introspect = False)
        dbusif_tboplayer = dbus.Interface(bus_object, "org.tboplayer.TBOPlayer")
    except Exception, e:
        print e

    if dbusif_tboplayer is None:
        tk.CallWrapper = ExceptionCatcher
        bplayer = TBOPlayer()
        TBOPlayerDBusInterface(bplayer)
        def refresh_player():
            bplayer.root.update()
            return True
        def run_gobject():
            gobject.MainLoop().run()
        gobject.idle_add(refresh_player)
        bplayer.root.after(100, run_gobject)
        bplayer.root.mainloop()
    else:
        if len(sys.argv[1:]) > 0:
            dbusif_tboplayer.openFiles(sys.argv[1:])
        exit()

我发现了问题。出于某种原因,使用 tkinter 和 gobject 的主循环会干扰 WM_DELETE_WINDOW 事件的行为,我在关闭程序之前使用它来保存一些数据。通过绑定到 Configure 事件解决了这个问题。现在主要方法如下:

if __name__ == "__main__":
    datestring=" 28 Fev 2017"

    dbusif_tboplayer = None
    try:
        bus = dbus.SessionBus()
        bus_object = bus.get_object("org.tboplayer.TBOPlayer", "/org/tboplayer/TBOPlayer", introspect = False)
        dbusif_tboplayer = dbus.Interface(bus_object, "org.tboplayer.TBOPlayer")
    except Exception, e:
        print e

    if dbusif_tboplayer is None:
        tk.CallWrapper = ExceptionCatcher
        bplayer = TBOPlayer()
        TBOPlayerDBusInterface(bplayer)
        gobject_loop = gobject.MainLoop()
        def refresh_player():
            try:
                bplayer.root.update()
                return True
            except Exception, e:
                bplayer.quit_omx()
                gobject_loop.quit()
        def run_gobject():
            gobject_loop.run()
        gobject.idle_add(refresh_player)
        bplayer.root.after(100, run_gobject)
        bplayer.root.mainloop()
    else:
        if len(sys.argv[1:]) > 0:
            dbusif_tboplayer.openFiles(sys.argv[1:])
        exit()