使用pyQt写GUI后,如果有键盘快捷键可以改善使用体验,提高效率某些方面的效率。
参考:
1.使用pyqt5实现键盘(含组合键)鼠标事件响应
2.Python matplotlib绘图,使用鼠标滚轮放大/缩小图像
3.【Python】【matplotlib】键鼠响应事件
键盘检测
主窗口继承自PyQt5.QtWidgets或PyQt5.QtWidgets.QMainWindow,在窗口class中重写函数keyPressEvent(self, event)
def keyPressEvent(self, event):
"""
重写了键盘检测事件函数。
:param event:
:return:
"""
print(f'检测按键{event.key()}按下!')
if event.key() == QtCore.Qt.Key_Down:
pass
# your code
elif event.key() == QtCore.Qt.Key_Up:
pass
# your code
elif event.key() == QtCore.Qt.Key_A:
pass
# your code
如果需要改变主窗口的鼠标滚轮事件就重写函数wheelEvent(self, event)
def wheelEvent(self, event):
"""
鼠标滚轮操作
:param event:
:return:
"""
# 向后时是-120,向前时是+120
angle = event.angleDelta().y()
try:
if angle < 0:
pass
# your code
else:
pass
# your code
except Exception as e:
print(e, 'error from wheelEvent()')
鼠标滚轮放大缩小绘图
在使用matlab plot时候可以通过鼠标选择绘图的大小,重置xlim和ylim,使用matplotlib时候上方会有菜单实现,但是绘制在GUI上就没有工具栏了,需要重写对应事件完成这个功能。参考2中使用
fig = plt.figure()
fig.canvas.mpl_connect('scroll_event', call_back)
绑定了scroll_event
的回调函数call_back()
。但是在一个figure中有多个canvas时候就需要把canvas这个参数也传递进去。使用labmda表达式1:
self.mycanv.mpl_connect('scroll_event', lambda event: self.xylimScale(event, self.mycanv))
而回调函数定义为:
def xylimScale(self, event, mycanvas):
axtemp = event.inaxes
x_min, x_max = axtemp.get_xlim()
# print(event.x)
print(event)
fanwei = (x_max - x_min) / 10
if event.button == 'up':
axtemp.set(xlim=(x_min + fanwei, x_max - fanwei))
print('up')
elif event.button == 'down':
axtemp.set(xlim=(x_min - fanwei, x_max + fanwei))
print('down')
mycanvas.draw_idle() # 绘图动作实时反映在图像上
这样实现了鼠标滚轮放大/缩小绘图,但是缩放时候的中心点是x轴中点,要实现鼠标位置点为中心点的缩放还要捕捉鼠标位置坐变换。
matplotlib - 在 fig.canvas.mpl_connect('key_press_event', on_key) 中,如何將參數傳遞給 on_key?, http://hant.ask.helplib.com/python/post_5278040 ↩︎