2014-01-28 2 views
1

Я пытаюсь получить одно окно 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)?

+0

вы просто пытаетесь открыть отдельное окно или отобразить это окно внутри главного окна? – user1938107

+0

Я пытаюсь открыть отдельное окно. – user2946797

ответ

1

Хорошо, у вас есть несколько проблем в вашем коде:

  1. У вас есть объект в Ui определения, но вы не его использование.
  2. Вы не можете пользователь matplotlib.use два раза в перспективе (один в главном .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:

# 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) 

#deleted the main function here 
+0

Это работает. Спасибо! У меня есть некоторые второстепенные вопросы о том, что вы сделали, что я написал в редактировании на мой пост. Не могли бы вы взглянуть на мои вопросы? – user2946797

Смежные вопросы