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

編集:純粋なpythonキーバインダーをコーディングする代わりに、キーバインダーライブラリを使用して問題を解決しました。 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 は PyGObject ではなく PyGtk を使用して開発されていることにも注意してください。

于 2012-11-21T20:58:12.163 に答える