Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python Gtk3+中模拟鼠标单击小部件;_Python_Gtk3 - Fatal编程技术网

在Python Gtk3+中模拟鼠标单击小部件;

在Python Gtk3+中模拟鼠标单击小部件;,python,gtk3,Python,Gtk3,多亏了库,Python3和GTK3.22.5应用程序响应全局键绑定。当前它调用一个简单的回调: def keybinder_callback(self, keystr, user_data): print("Handling", keystr, user_data) 应用程序中的其他地方是一个Gtk.Window,其中包含Gtk.MenuBar。keybinder\u回调需要激活菜单栏,就像用户在菜单栏上单击鼠标一样 (这是一个非常基本的dock类型应用程序,而不是一个具有典型应用程序

多亏了库,Python3和GTK3.22.5应用程序响应全局键绑定。当前它调用一个简单的回调:

def keybinder_callback(self, keystr, user_data):
    print("Handling", keystr, user_data)
应用程序中的其他地方是一个
Gtk.Window
,其中包含
Gtk.MenuBar
keybinder\u回调
需要激活菜单栏,就像用户在菜单栏上单击鼠标一样

(这是一个非常基本的dock类型应用程序,而不是一个具有典型应用程序窗口的应用程序)

我已尝试向菜单项发送信号:

self.menubar.get_children()[0].emit("activate-item")
没有任何乐趣。我还试着假装按下按钮

from Xlib.ext.xtest import fake_input
fake_input(display,X.ButtonPress,1)
这也没有任何效果,但感觉无论如何都是错误的做法。我认为发出一个信号会更合适

小部件是否可以像用户鼠标单击一样以编程方式激活?

(它不必是模拟的鼠标点击——它只需要像鼠标点击一样激活和聚焦小部件)


我写了一篇类似这样的文章:

def keybinder_callback(self, keystr, user_data):
  print("Handling", keystr, user_data)
  print("Event time:", Keybinder.get_current_event_time())
  activate_the_menu()
我需要向该功能添加一些命令,以激活菜单

我尝试过很多事情,包括捕捉真实事件(通过使用
xev
)和模拟它们(
ENTER\u NOTIFY
FOCUS\u CHANGE
),将它们注入
Gdk.main\u do\u event

我试过调用
菜单.弹出窗口
菜单.弹出窗口小部件
菜单栏.选择项目
和其他许多东西。都没有用

没了主意,我甚至把我的旧Xlib书掸掉了

顺便说一句,虽然这不是一个合适的解决方案,但它从一个外壳开始工作:

$ xdotool mousemove 1605 10 click 1 mousemove restore
但从
keybinder\u回调不可靠

run("xdotool mousemove %d 10 click 1 mousemove restore" %
            (self.get_position().root_x+5) , shell=True)

在尝试了很多东西之后,我发现这是有效的

import Xlib
from Xlib import X
from Xlib.display import Display
from Xlib.ext.xtest import fake_input
import time

def keybinder_callback(self, keystr, user_data):
    time.sleep(0.2)
    x = self.get_position().root_x+5
    display = Display()
    mpos = display.screen().root.query_pointer()._data
    display.screen().root.warp_pointer(x,5)
    display.sync()
    fake_input(display,X.ButtonPress,1, X.CurrentTime, X.NONE, x, 5)
    display.sync()
    fake_input(display,X.ButtonRelease,1)
    display.screen().root.warp_pointer(mpos['root_x'],
                                       mpos['root_y'])
    display.sync()
我发现时间延迟是避免此错误所必需的:

Gdk-CRITICAL **: Window 0x1e7c660 has not been made visible in GdkSeatGrabPrepareFunc

看一看,但要小心,我玩电脑的时候差点把它冻住了。不太清楚发生了什么,但在菜单弹出后,我无法再关闭程序。我尝试了
self.menu.popup\u小部件(self,Gdk.Gravity.STATIC,Gdk.Gravity.STATIC,None)
但是得到了
警告:g\u object\u set\u数据:断言“g\u是\u object(object)”