加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 01:44:03 所属栏目:Linux 来源:网络整理
导读:我想做什么以及为什么 我希望我的窗口不聚焦,因此选择了之前的聚焦窗口. 为什么?我想与之前选择的窗口(来自其他程序)进行交互.我目前的计划是:取消我的窗口,使用libxdo来模拟击键,然后再次关注我的窗口. 我的窗口可以设置在顶部以帮助避免轻弹.应该够好了.
我想做什么以及为什么

我希望我的窗口不聚焦,因此选择了之前的聚焦窗口.

为什么?我想与之前选择的窗口(来自其他程序)进行交互.我目前的计划是:取消我的窗口,使用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>

解决方法

一个简单的解决方案是在创建窗口之前记录哪个窗口具有焦点,然后在每个焦点事件中,并明确地聚焦该窗口而不是尝试使活动窗口不聚焦:

import signal
from gi import require_version
require_version('Gtk',Gdk,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()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读