我遇到PyQt和Mathplotlib的问题。 在这里你可以找到我正在做的伪代码:我有一个类“MainWindow”,它创建一个带有菜单和空mathplotlib图形的主窗口。当我单击菜单项时,执行“选择”方法,打开一个新的对话框。还有一种方法可以绘制全局变量Data的内容。
import TeraGui
Data = []
class MainWindow(QMainWindow, TeraGui.Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.actionSelect.triggered.connect(self.Select)
# Create the frame with the graphs
self.create_main_frame()
#Plot empty graphs
self.axes.clear()
self.canvas.draw()
def create_main_frame(self):
self.main_frame = QWidget()
# Create the mpl Figure and FigCanvas objects.
# 5x4 inches, 100 dots-per-inch
#
self.dpi = 100
self.fig = Figure((5.0, 4.0), dpi=self.dpi)
self.canvas = FigureCanvas(self.fig)
self.canvas.setParent(self.main_frame)
#
self.axes = self.fig.add_subplot(111)
# Create the navigation toolbar, tied to the canvas
#
self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)
#
# Layout with box sizers
#
vbox = QVBoxLayout()
vbox.addWidget(self.canvas)
vbox.addWidget(self.mpl_toolbar)
self.main_frame.setLayout(vbox)
self.setCentralWidget(self.main_frame)
def Plotting(self):
""" Redraws the figure
"""
print "I am here"
time = Data[0]
sig = Data[]
plot(time, sig)
# clear the axes and redraw the plot anew
#
self.axes.clear()
self.axes.plot(time, sig)
self.canvas.draw()
def Select(self):
dialog = Dialog(self)
dialog.exec_()
现在,如果我在MainWindow类的 init 方法中添加这些行:
Global Data
Data = [[1,2,3],[4,5,6]]
self.Plotting()
打印“我在这里”,图表正确显示在图表中,但如果我不添加这些行,我尝试从Dialog类调用Plotting它不起作用。 “我在这里”被绘制,但情节保持空白。在Dialog类中,当按下按钮框的“ok”按钮时,方法“accept”被取消:
class Dialog(QDialog, TeraGui.Ui_SelectFiles):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setAttribute(Qt.WA_DeleteOnClose)
self.setupUi(self)
def accept(self):
global Data
Data = [[1,2,3],[4,5,6]]
MainWindow().Plotting()
绘图方法还通过命令“plot(time,sig)”绘制单独的绘图。无论用于调用Plotting的方式如何,该图总是正确显示。
这是我用PyQt和matplotlib的第一次尝试,我无法识别错误。
答案 0 :(得分:1)
问题在于
行MainWindow().Plotting()
当您编写MainWindow()
时,实际上是在创建MainWindow
类的新实例并调用其Plotting()
函数,而不是您现有的MainWindow
实例。此窗口永远不会显示,并且由于您不保存对它的引用,因此在accept()
返回时会被删除。它存在的唯一证据是它写入控制台的'i am here'
消息。这就是你不能看到情节的原因。
在这种情况下,您将MainWindow
实例设置为dialog
到dialog = Dialog(self)
的父级,因此您可以通过调用parent()
来访问它。
self.parent().Plotting()
您还应该考虑向Plotting()
函数添加另一个参数,这样您就可以直接将数据传递给它,而不必在任何地方声明全局变量。
def Plotting(self, Data):
...