【问题标题】:'Close window' button wont work when using tkinter + gobject使用 tkinter + gobject 时,“关闭窗口”按钮不起作用
【发布时间】:2017-07-19 12:08:37
【问题描述】:

我的 tkinter 应用程序运行良好,但要实现 dbus 功能,我必须使用 gobject。一切正常,除了运行 tkinter 和 gobject 的 mainloops 会使标准窗口管理器中的“关闭窗口”按钮(窗口界面中的“x”按钮)不起作用。 :/ 其他一切正常,包括调整大小、最小化/最大化、恢复和移动窗口。

感谢您的帮助,

谢谢,


小代码sn-p:

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()

【问题讨论】:

    标签: linux python-2.7 tkinter dbus gobject


    【解决方案1】:

    我发现了问题。出于某种原因,使用 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 2018-07-06
      • 2018-12-31
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多