当按下按钮时,让PyQt4打开另一个Qt窗口

2024-09-27 23:20:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让一个Qt窗口在按下按钮时在另一个Qt窗口中显示matplotlib图形。我有一个.py文件,它用按钮生成用户界面,还有一个.py文件,运行时会打开一个显示图形的QT窗口。在

如果我只运行第二个.py文件,那么显示图形的QT窗口就会打开,这没问题。在

但是,问题是,当我运行第二个.py文件时,pythonw.exe当我单击按钮运行第二个.py文件时崩溃。在

下面是代码(一个.py文件。如果用户希望看到matplotlib图形,它将创建一个用户界面,供用户单击按钮):

import matplotlib
matplotlib.use('Qt4Agg')
import pylab
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

import matplotlibtest
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(690, 786)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.widget_2 = QtGui.QWidget(self.centralwidget)
        self.widget_2.setGeometry(QtCore.QRect(120, 20, 471, 51))
        self.widget_2.setObjectName(_fromUtf8("widget_2"))

        #...some other irrelevant code...

        self.plotButton = QtGui.QPushButton(self.layoutWidget_2)
        self.plotButton.setMinimumSize(QtCore.QSize(0, 23))
        self.plotButton.setObjectName(_fromUtf8("plotButton"))
        self.gridLayout_2.addWidget(self.plotButton, 9, 1, 1, 1)
        self.plotButton.clicked.connect(self.showimage)

    def showimage(self):
        matplotlibtest.main()

因此,当用户单击绘图按钮时,的主要功能是matplotlibtest.py运行。在

matplotlibtest.py,我有这个代码(来自http://packtlib.packtpub.com/library/9781847197900/ch06)。此代码在运行时打开一个QT窗口,该窗口显示一个简单的matplotlib图形。这里没有问题——当这段代码运行时,它会像我希望的那样打开图形。在

^{pr2}$

如何在单击按钮时显示matplotlib图形?在

为什么pythonw.exe崩溃?在

编辑:

如果我想传递参数(x=[1,2,3],y=[1,1,1])来生成图,我会把class Qt4MplCanvas(FigureCanvas): def __init__(self,parent,x,y)放进去,当我构造它时,我会写qmc = Qt4MplCanvas(self.main_widget, [1,2,3], [1,1,1])?在

__init__中,对于任何Qt对象,我们是否运行super的__init__来初始化Qt对象的父对象? 为什么super(MyMainWindow,self)的参数是?在

为什么我们在 class Ui_MainWIndow(object): 但我们使用'QtGui.QMainWindow'在 class MyMainWindow(QtGui.QMainWindow)?在

是'object'和'QtGui.QMainWindow“争论?在

当我们构造一个Ui主窗口时,为什么要写 self.ui = Ui_MainWindow() 而不是 self.ui = Ui_MainWindow(object)?在


Tags: 文件pyimportself图形uimatplotlibdef
1条回答
网友
1楼 · 发布于 2024-09-27 23:20:55

好吧,你的代码有几个问题:

  1. 您有一个Ui定义对象,但您没有使用它。在
  2. 您不能在一次运行中使用matplotlib.use两次(一次在main.py中,一次在matplotlibtest中)
  3. 如果要运行PyQt应用程序,必须创建一个QApplication对象
  4. 其他涉及布局的小错误

对于解决方案,请检查代码,以下是我对您的代码所做的一些修改,以使其正常工作:

.py主文件中

from PyQt4 import QtCore,QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(690, 786)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayout_2 = QtGui.QGridLayout(self.centralwidget) #here
        self.centralwidget.setLayout(self.gridLayout_2) #here

        #...some other irrelevant code...

        self.plotButton = QtGui.QPushButton() #here
        self.plotButton.setMinimumSize(QtCore.QSize(0, 23))
        self.plotButton.setObjectName(_fromUtf8("plotButton"))
        self.gridLayout_2.addWidget(self.plotButton, 9, 1, 1, 1)
        self.plotButton.clicked.connect(self.showimage)

    def showimage(self):
        #changes here
        from matplotlibtest import ApplicationWindow
        self.aw = ApplicationWindow()
        self.aw.show()

#class that actually shows something
class MyMainWindow(QtGui.QMainWindow):

    def __init__(self,parent=None):
        super(MyMainWindow,self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

#put the main window here
def main():
    import sys
    qApp = QtGui.QApplication(sys.argv)
    aw = MyMainWindow()
    aw.show()
    sys.exit(qApp.exec_())

if __name__ == '__main__':
    main()  

matplotlibtest.py

^{pr2}$

相关问题 更多 >

    热门问题