在Python Gtk3+中模拟鼠标单击小部件;
多亏了库,Python3和GTK3.22.5应用程序响应全局键绑定。当前它调用一个简单的回调:在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类型应用程序,而不是一个具有典型应用程序
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)”