Я пытаюсь получить одно окно Qt для отображения фигуры matplotlib в другом окне Qt при нажатии кнопки. У меня есть файл .py, который генерирует этот пользовательский интерфейс с помощью кнопки, а другой файл .py, который при запуске открывает окно QT, отображающее график.Получить PyQt4, чтобы открыть другое окно 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()
Таким образом, когда пользователь щелкает plotButton, основная функция matplotlibtest.py бежит.
И в matplotlibtest.py, У меня есть этот код (от http://packtlib.packtpub.com/library/9781847197900/ch06). Этот код при запуске открывает окно QT, которое отображает простой график matplotlib. Здесь нет проблемы - когда этот код запущен, он открывает график так, как я этого хочу.
# for command-line arguments
import sys
# Python Qt4 bindings for GUI objects
from PyQt4 import QtGui
# Numpy functions for image creation
import numpy as np
# Matplotlib Figure object
from matplotlib.figure import Figure
import matplotlib
matplotlib.use('Qt4Agg')
# import the Qt4Agg FigureCanvas object, that binds Figure to
# Qt4Agg backend. It also inherits from QWidget
from matplotlib.backends.backend_qt4agg \
import FigureCanvasQTAgg as FigureCanvas
# import the NavigationToolbar Qt4Agg widget
from matplotlib.backends.backend_qt4agg \
import NavigationToolbar2QTAgg as NavigationToolbar
class Qt4MplCanvas(FigureCanvas):
def __init__(self, parent):
# plot definition
self.fig = Figure()
self.axes = self.fig.add_subplot(111)
t = np.arange(0.0, 3.0, 0.01)
s = np.cos(2*np.pi*t)
self.axes.plot(t, s)
# initialization of the canvas
FigureCanvas.__init__(self, self.fig)
# set the parent widget
self.setParent(parent)
# we define the widget as expandable
FigureCanvas.setSizePolicy(self,
QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Expanding)
# notify the system of updated policy
FigureCanvas.updateGeometry(self)
class ApplicationWindow(QtGui.QMainWindow):
def __init__(self):
# initialization of Qt MainWindow widget
QtGui.QMainWindow.__init__(self)
# set window title
self.setWindowTitle("Matplotlib Figure in a Qt4 Window With NavigationToolbar")
# instantiate a widget, it will be the main one
self.main_widget = QtGui.QWidget(self)
# create a vertical box layout widget
vbl = QtGui.QVBoxLayout(self.main_widget)
# instantiate our Matplotlib canvas widget
qmc = Qt4MplCanvas(self.main_widget)
# instantiate the navigation toolbar
ntb = NavigationToolbar(qmc, self.main_widget)
# pack these widget into the vertical box
vbl.addWidget(qmc)
vbl.addWidget(ntb)
# set the focus on the main widget
self.main_widget.setFocus()
# set the central widget of MainWindow to main_widget
self.setCentralWidget(self.main_widget)
def main():
# create the GUI application
qApp = QtGui.QApplication(sys.argv)
# instantiate the ApplicationWindow widget
aw = ApplicationWindow()
# show the widget
aw.show()
sys.exit(qApp.exec_())
if __name__ == '__main__':
main()
Как получить график matplotlib, отображаемый при нажатии кнопки?
Почему pythonw.exe crash?
EDIT:
Если бы я хотел передать аргументы (х = [1,2,3], у = [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, мы запускаем супер __init__
, чтобы инициализировать родительский объект Qt? Почему аргументы super(MyMainWindow,self)
?
Почему мы используем 'объект' в class Ui_MainWIndow(object):
, но мы используем 'QtGui.QMainWindow' в class MyMainWindow(QtGui.QMainWindow)
?
Есть аргументы «объект» и «QtGui.QMainWindow»?
Когда мы строим Ui_MainWindow, почему мы пишем self.ui = Ui_MainWindow()
и не self.ui = Ui_MainWindow(object)
?
вы просто пытаетесь открыть отдельное окно или отобразить это окно внутри главного окна? – user1938107
Я пытаюсь открыть отдельное окно. – user2946797