2017-02-28 7 views
0

私のtkinterアプリケーションは正常に動作しますが、dbus機能を実装するためにはgobjectを使用しなければなりませんでした。それが機能していることを除いて、tkinterとgobjectのメインループの両方を実行することは、標準のウィンドウマネージャ(ウィンドウインタフェースの「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のメインループを使用すると、プログラムを閉じる前にいくつかのデータを保存するために使用していた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() 
関連する問題