如何在Linux上使Python-gi GTK + 3窗口散焦(模糊)

豪尔赫·苏亚雷斯·德·利斯

我想做什么以及为什么

我希望窗口不聚焦,因此选择了上一个聚焦窗口。

为什么?我想与先前选择的窗口(从其他程序)进行交互。我当前的计划是:使窗口不libxdo聚焦,用于模拟按键,然后再次使窗口聚焦。

我的窗口可以设置在顶部,以帮助避免轻拂。应该足够好了。对我来说看起来很简单。但是我无法正常工作。

到目前为止我尝试过的

将窗口隐藏在一起Gtk.Widget.hide(),然后再次显示它:窗口闪烁太多,并且稍微向顶部移动了一些像素(我想是因为窗口管理器很固执)。

样本测试代码

当前的代码调用Gtk.Window.set_focus(None)不起作用。我需要用其他可以代替我做的东西代替那条线。

losefocus.py

import signal
from gi import require_version
require_version('Gtk', '3.0')
from gi.repository import GLib, Gtk, GObject

class LoseFocusHandler:
  def onClick(self, window):
    print "Losing focus yet?"
    window1 = builder.get_object("window1")
    window1.set_focus(None)

if __name__ == "__main__":
  GObject.threads_init()

  builder = Gtk.Builder()
  builder.add_from_file("losefocus.glade")
  builder.connect_signals(LoseFocusHandler())
  window1 = builder.get_object("window1")
  window1.show_all()

  signal.signal(signal.SIGINT, signal.SIG_DFL)
  Gtk.main()

losefocus.glade

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
  <requires lib="gtk+" version="3.10"/>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="window_position">center-always</property>
    <property name="gravity">center</property>
    <child>
      <object class="GtkButton" id="button1">
        <property name="label" translatable="yes">Lose Focus!</property>
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="receives_default">True</property>
        <property name="relief">half</property>
        <signal name="clicked" handler="onClick" swapped="no"/>
      </object>
    </child>
  </object>
</interface>
菲利普

一个简单的解决方案是在创建窗口时然后在每个窗口上记录之前哪个窗口已聚焦,然后focus-in-event显式聚焦该窗口,而不是试图使活动窗口失去焦点:

import signal
from gi import require_version
require_version('Gtk', '3.0')
from gi.repository import GLib, Gdk, Gtk, GObject

class LoseFocusHandler:
  def onClick(self, window):
    print "Losing focus yet?"
    old_window[0].focus(0)

def focus_handler(gdk_window, event):
    # At this point, our window does not have focus yet, but is
    # about to. This hence works:
    old_window[0] = gdk_window.get_screen().get_active_window()

if __name__ == "__main__":
  GObject.threads_init()

  old_window = [ Gdk.Screen.get_default().get_active_window() ]

  builder = Gtk.Builder()
  builder.add_from_file("losefocus.glade")
  builder.connect_signals(LoseFocusHandler())
  window1 = builder.get_object("window1")
  window1.connect("focus-in-event", focus_handler)
  window1.show_all()

  signal.signal(signal.SIGINT, signal.SIG_DFL)
  Gtk.main()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python GTK + 3教程Hello World中没有名为“ gi”的模块

如何从gi.repository导入gtk.gdk

如何在 Haskell 的 GI-Gtk 中将 Widget 转换为 Label?

如何在virtualenv中安装python3-gi?

Python 3 找不到“gi”模块

Python3无法导入gi

如何修复由于缺少“ gi.repository”而导致的“无法导入:GTK +”错误?

如何导入 Gtk、gi.repository?表格网格的最佳 GUI?Tkinter * vs ttk?

如何修复“ gi.require_version('Gtk','3.0')”的“'模块'对象没有属性'required_version'”?

使用haskell-gi GTK信号

如何在GTK + 3的gtk窗口中创建cairo对象

找不到python包gi,虽然安装了python3-gi

如何为Anaconda python3安装gi模块?

python的gi模块与python3不兼容

如何使Gtk + 3窗口全屏显示?

Python 3:使用pip安装gi软件包

为什么python3无法导入gi.repository?

使用gi-gtk和Reactive Banana捕获Haskell异常

如何从屏幕上获取像素值(GTK 3,Shell,Linux)

为什么用haskell / stack编译GTK(gi-gtk)应用程序是不可复制的?

无法导入Python GI模块

无法安装python-gi

如何在python中正确显示和隐藏GTK窗口

Python GTK3:如何创建Gtk.FileChooseDialog?

Python GTK3:如何使用gtk _ * _ new _ *()函数

如何在 GTK3 和 Python 2.7 中的图像对象上创建“单击事件”

在Arch上找不到Python模块'gi'

使用 Python GTK3 Gtk.Application 打开多个应用程序窗口的正确方法

如何在Windows和PyCharm上使用PyGObject模块(gi)?