2012-11-20 76 views
3

我寫了全局快捷鍵示例隱藏並顯示我的窗口與鍵'F12',我用python-xlib和一些名爲'pyxhook'的腳本一切正常,除了當我想隱藏)和顯示()窗口幾次我的進程變成殭屍,但相同的代碼隱藏和顯示只是按鈕。python gtk gobject切換窗口的可見性

#!/usr/bin/python 
# -*- coding: utf-8; -*- 
from gi.repository import Gtk, GObject 
from pyxhook import HookManager 
GObject.threads_init() 
class Win(Gtk.Window): 

    def __init__(self): 
     super(Win, self).__init__() 
     self.connect('destroy', Gtk.main_quit) 
     self.button = Gtk.Button() 
     self.add(self.button) 
     self.resize(200,150) 
     self.show_all() 

    def handle_global_keypress(self, event): 
     if event.Key == 'F12': 
      if self.get_visible(): 
       self.hide() 
      else: 
       self.show() 

      ### this part works fine with button 

      #if self.button.get_visible(): 
      # self.button.hide() 
      #else: 
      # self.button.show() 

def main(): 
    app = Win() 
    hm = HookManager() 
    hm.HookKeyboard() 
    hm.KeyDown = app.handle_global_keypress 
    hm.start() 
    Gtk.main() 

    hm.cancel() 

if __name__ == "__main__":  
    main() 

編輯:我解決了我的問題,使用Keybinder庫而不是編碼純python keybinder。 http://kaizer.se/wiki/keybinder/

回答

2

我無法回答您的具體問題,但我可能會建議其他選項。 Guake控制檯實現這個非常相同的行爲,但使用的dbus:

http://guake.org/

dbusiface.py文件,你可以找到:

import dbus 
import dbus.service 
import dbus.glib 
import gtk 
import guake.common 
dbus.glib.threads_init() 

DBUS_PATH = '/org/guake/RemoteControl' 
DBUS_NAME = 'org.guake.RemoteControl' 

class DbusManager(dbus.service.Object): 
    def __init__(self, guakeinstance): 
     self.guake = guakeinstance 
     self.bus = dbus.SessionBus() 
     bus_name = dbus.service.BusName(DBUS_NAME, bus=self.bus) 
     super(DbusManager, self).__init__(bus_name, DBUS_PATH) 

    @dbus.service.method(DBUS_NAME) 
    def show_hide(self): 
     self.guake.show_hide() 

除其他方法。這值得探索。另請注意,Guake是使用PyGtk而不是PyGObject開發的,但無論如何你可以得到一些想法。