4

我为隐藏和显示我的窗口编写了全局快捷方式示例,使用像“F12”这样的键,我使用了 python-xlib 和一些名为“pyxhook”的脚本,一切正常,除非我想隐藏()和显示()窗口几次我的过程变成一个僵尸,但相同的代码可以隐藏和显示按钮。

#!/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/

4

1 回答 1

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 开发的,但无论如何你可以得到一些想法。

于 2012-11-21T20:58:12.163 回答