2017-02-28 46 views
0

我Tkinter的应用程序运行正常,但实现的功能DBUS我不得不使用的GObject。得到它的工作和所有的,不同之处在于,同时运行的Tkinter的和GObject的mainloops使得从标准的窗口管理器“关闭窗口”按钮(在窗口界面的“X”按钮)不工作。 :/其他一切工作正常,包括调整大小,最小化/最大化,还原和移动窗口。“关闭窗口”按钮,使用Tkinter的时候不会工作+ GObject的

任何帮助表示赞赏,

感谢,


小的代码片段:

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

回答

0

我发现这个问题。出于某种原因,使用的Tkinter的和GObject的mainloops与WM_DELETE_WINDOW事件,我用了关闭程序之前保存一些数据的行为干扰。而不是通过绑定到配置事件解决了这个问题。现在主要方法如下:

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() 
相关问题