matplotlib 和 Qt:鼠标滚动事件键总是 None
matplotlib and Qt: mouse scroll event key is always None
目前已修复!
我正在尝试使用带有嵌入式 matplotlib 的 PyQt4 制作 GUI canvas。当我将光标滚动到 canvas 上时,我希望能够根据额外的按键(在本例中为控制)来控制行为。但是,链接到 'scroll_event' 的 mouseEvent 的键属性始终是 None。我测试了我的代码是否正确注册了由 'button_press_event' 生成的 mouseEvent 的密钥。
在下面的示例中,on_press
方法正确打印了同时按下的键。而 on_scoll
总是打印 None.
如何访问在鼠标滚动事件期间按下的键?
提前致谢!
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import matplotlib
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
class GraphicTool(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
self.create_menu()
def on_press(self, event):
print event.key
def on_scroll(self, event):
print event.key
if event.key == 'ctrl':
# do something
pass
else:
# do something else
pass
def create_main_frame(self):
self.main_frame = QWidget()
# Create the mpl Figure and FigCanvas objects.
# 10x8 inches, 100 dots-per-inch
self.dpi = 100
self.fig = Figure((10.0, 8.0), dpi=self.dpi)
self.canvas = FigureCanvas(self.fig)
self.canvas.setParent(self.main_frame)
self.canvas.setFocusPolicy(Qt.ClickFocus)
self.canvas.setFocus()
self.axes = self.fig.add_subplot(111)
self.canvas.mpl_connect('scroll_event', self.on_scroll)
self.canvas.mpl_connect('button_press_event', self.on_press)
# Create the navigation toolbar, tied to the canvas
self.mpl_toolbar = NavigationToolbar(self.canvas,
self.main_frame)
vbox = QVBoxLayout()
vbox.addWidget(self.canvas)
vbox.addWidget(self.mpl_toolbar)
self.main_frame.setLayout(vbox)
self.setCentralWidget(self.main_frame)
def main():
app = QApplication(sys.argv)
viewer = GraphicTool()
viewer.show()
viewer.raise_()
app.exec_()
if __name__ == "__main__":
main()
上面的简短示例确实按预期工作。但是,当我将它合并到一个更大的项目中时,它失败了。我将继续调试以查看是否有任何其他事件干扰了滚动事件。
我已经检查了你的代码。这按预期工作。
def on_scroll(self, event):
print event.xdata
print event.ydata
print event.key
if event.key == 'ctrl':
# do something
pass
else:
# do something else
pass
这是您的代码的输出。我刚刚将 xdata 和 ydata 添加到您的代码中。
0.480977867785
0.57896567718
control
0.480977867785
0.57896567718
shift
0.480977867785
0.57896567718
shift
目前已修复!
我正在尝试使用带有嵌入式 matplotlib 的 PyQt4 制作 GUI canvas。当我将光标滚动到 canvas 上时,我希望能够根据额外的按键(在本例中为控制)来控制行为。但是,链接到 'scroll_event' 的 mouseEvent 的键属性始终是 None。我测试了我的代码是否正确注册了由 'button_press_event' 生成的 mouseEvent 的密钥。
在下面的示例中,on_press
方法正确打印了同时按下的键。而 on_scoll
总是打印 None.
如何访问在鼠标滚动事件期间按下的键?
提前致谢!
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import matplotlib
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
class GraphicTool(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
self.create_menu()
def on_press(self, event):
print event.key
def on_scroll(self, event):
print event.key
if event.key == 'ctrl':
# do something
pass
else:
# do something else
pass
def create_main_frame(self):
self.main_frame = QWidget()
# Create the mpl Figure and FigCanvas objects.
# 10x8 inches, 100 dots-per-inch
self.dpi = 100
self.fig = Figure((10.0, 8.0), dpi=self.dpi)
self.canvas = FigureCanvas(self.fig)
self.canvas.setParent(self.main_frame)
self.canvas.setFocusPolicy(Qt.ClickFocus)
self.canvas.setFocus()
self.axes = self.fig.add_subplot(111)
self.canvas.mpl_connect('scroll_event', self.on_scroll)
self.canvas.mpl_connect('button_press_event', self.on_press)
# Create the navigation toolbar, tied to the canvas
self.mpl_toolbar = NavigationToolbar(self.canvas,
self.main_frame)
vbox = QVBoxLayout()
vbox.addWidget(self.canvas)
vbox.addWidget(self.mpl_toolbar)
self.main_frame.setLayout(vbox)
self.setCentralWidget(self.main_frame)
def main():
app = QApplication(sys.argv)
viewer = GraphicTool()
viewer.show()
viewer.raise_()
app.exec_()
if __name__ == "__main__":
main()
上面的简短示例确实按预期工作。但是,当我将它合并到一个更大的项目中时,它失败了。我将继续调试以查看是否有任何其他事件干扰了滚动事件。
我已经检查了你的代码。这按预期工作。
def on_scroll(self, event):
print event.xdata
print event.ydata
print event.key
if event.key == 'ctrl':
# do something
pass
else:
# do something else
pass
这是您的代码的输出。我刚刚将 xdata 和 ydata 添加到您的代码中。
0.480977867785
0.57896567718
control
0.480977867785
0.57896567718
shift
0.480977867785
0.57896567718
shift