2017-02-28 5 views
0

Meine tkinter-Anwendung läuft gut, aber um dbus-Funktionalität zu implementieren, musste ich gobject verwenden. Es funktionierte und alles, abgesehen davon, dass die Hauptloops sowohl von tkinter als auch von gobject ausgeführt werden, bewirkt, dass die Schaltfläche "Fenster schließen" vom Standard-Fenstermanager (Schaltfläche "x" in der Fensterschnittstelle) nicht funktioniert. :/Alles andere funktioniert gut, einschließlich Größenanpassung, Minimierung/Maximierung, Wiederherstellung und Verschieben des Fensters.'Fenster schließen' funktioniert nicht, wenn tkinter + gobject verwendet wird

Jede Hilfe ist willkommen,

Danke,


kleiner Code-Schnipsel:

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

Antwort

0

fand ich das Problem. Aus irgendeinem Grund stört die Verwendung der Hauptloops von tkinter und gobject das Verhalten des WM_DELETE_WINDOW-Ereignisses, das ich zum Speichern einiger Daten vor dem Schließen des Programms verwendet habe. Das Problem wurde gelöst, indem stattdessen eine Verbindung zum Configure-Ereignis hergestellt wurde. Und jetzt ist die Hauptmethode wie folgt:

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