Не очищать график перед построением другого графика с помощью matplotlib в pyqt5 внутри tabWidget - PullRequest
0 голосов
/ 05 мая 2018

Я изучаю pyqt 5 и python и хотел создать простое приложение, которое показывало бы макет с вкладками web-страницы и графиком matplotlib. Когда я изменил комбинированный список, я хотел показать файл формы для страны на графике matplotlib, однако я могу показать только первый файл формы. `Ниже приведен упрощенный код, который показывает расположение и проблему, а не шейп-файл для примера. У меня просто есть несколько отличающиеся функции, которые должны измениться при изменении комбинированного списка. Однако показан только самый первый график, и хотя переменные передаются из комбинированного списка, новая функция не отображается. По сути, на данный момент все, что я хочу сделать, это иметь возможность потянуть вниз выпадающий список, выбрать другую страну и увидеть появление нового графика. Другие предложения также приветствуются. Пример кода ниже.

import numpy as np
import sys
from PyQt5.QtCore import QUrl,QRect,QSize
from PyQt5.QtWebEngineWidgets import QWebEngineSettings, QWebEngineView, QWebEnginePage 
from PyQt5.QtWidgets import (QApplication, QMainWindow,QMenu,QHBoxLayout,QVBoxLayout,QFrame,QLabel,
QSizePolicy, QMessageBox, QWidget, QPushButton,QRadioButton,
QTextBrowser,QDialog,QGroupBox,QTabWidget,QComboBox,QListWidget)

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import shapefile as shp
import matplotlib.pyplot as plt

import random

data_square=[(0,0),(1,0),(1,1),(0,1),(0,0),(1,1)]
data_rectangle=[(0,0),(2,0),(2,1),(0,1),(0,0),(1,1)]

class MyBrowser(QWebEnginePage):

    def userAgentForUrl(self, url):
        return "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"

class Web(QWebEngineView):

    def load(self, url):
        self.setUrl(QUrl(url))

    def adjustTitle(self):
        self.setWindowTitle(self.title())

    def disableJS(self):
        settings = QWebEngineSettings.globalSettings()
        settings.setAttribute(QWebEngineSettings.JavascriptEnabled, False)




class App(QDialog):
    def __init__(self):
        super().__init__()
        self.title= 'Test Building PyQT5 with Tabs'
        self.left = 40
        self.top = 40
        self.width = 400
        self.height = 100
        self.initUI()


    def initUI(self):        
        #self.setWindowTitle(self.title)
        #self.setGeometry(100,100,1000,800)
        #self.create_my_layout()
        #my_main_window_layout=QVBoxLayout()
        #self.setLayout(my_main_window_layout)
        #self.show()

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.create_my_layout()

        windowLayout = QVBoxLayout()
        #windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(windowLayout)

        self.show()

    def my_combo_active(self,index):
        my_specific_country = self.my_combo.itemText(index)
        if my_specific_country=='Afghanistan':
            m = PlotCanvas(self.my_graphic, width=5, height=5, dpi=100,atest='abc',sf=data_square)
            print('A')
        if my_specific_country=='Bangladesh':
            m = PlotCanvas(self.my_graphic, width=5, height=5, dpi=100,atest='def',sf=data_rectangle)
            print('B')


    def create_my_layout(self):
# Set up group boxes along left side of window
        my_groupbox1=QGroupBox('box 1')
        my_groupbox2=QGroupBox('box 2')

        my_button1=QRadioButton('a button')
        my_button1.setChecked(True)
        #radiobutton.toggled.connect(self.on_radio_button_toggled)
        my_button2=QRadioButton('another button')

        my_button5=QRadioButton('more button')
        my_button5.setChecked(True)
        my_button6=QRadioButton('even more button')

        v_box0=QVBoxLayout()
        v_box0.addWidget(my_button1)
        v_box0.addWidget(my_button2)
        my_groupbox1.setLayout(v_box0)

        v_box00=QVBoxLayout()
        v_box00.addWidget(my_button5)
        v_box00.addWidget(my_button6)
        my_groupbox2.setLayout(v_box00)



#set up Tab Widget to end up on right side   
        my_tabWidget=QTabWidget()
        tab1=QWidget()
        tab2=QWidget()

        my_tabWidget.addTab(tab1,"Tab 1")
        my_tabWidget.addTab(tab2,"Tab 2")



# Add To Tab 1
        my_label_country=QLabel('Country')
        my_label_country.setMaximumSize(QSize(1000,50))
        my_label_map=QLabel('Map')

        self.my_combo=QComboBox()
        self.my_combo.activated.connect(self.my_combo_active)
        self.my_graphic=QFrame()
        self.my_graphic.setMinimumSize(QSize(500,500))

        my_list1=QListWidget()
        my_list2=QListWidget()
        my_list3=QListWidget()
        my_button_complete=QPushButton('')
        #my_list4=QListWidget()

        tab1.v_box1=QVBoxLayout()
        tab1.v_box1.addWidget(self.my_combo)
        tab1.v_box1.addWidget(my_label_map)
        tab1.v_box1.addWidget(self.my_graphic)
        tab1.v_box1.addWidget(my_list1)

        tab1.v_box2=QVBoxLayout()
        tab1.v_box2.addWidget(my_list2)

        tab1.v_box3=QVBoxLayout()
        tab1.v_box3.addWidget(my_list3)
        tab1.v_box3.addWidget(my_button_complete)

        tab1.h_box1=QHBoxLayout()
        tab1.h_box1.addLayout(tab1.v_box1)
        tab1.h_box1.addLayout(tab1.v_box2)
        tab1.h_box1.addLayout(tab1.v_box3)

        tab1.setLayout(tab1.h_box1)

# now add Elements to Tab 2 
        my_label_webpage=QLabel('A Web Page')
        my_label_webpage.setMaximumSize(QSize(1000,20))


        #my_combo=QComboBox()
# PC version
        #my_webpage=QWebView()
#Mac version
        my_webpage=Web()
        my_list_exText=QListWidget()



        tab2.v_box1=QVBoxLayout() 
        tab2.v_box1.addWidget(my_webpage)

        tab2.v_box2=QVBoxLayout()
        tab2.v_box2.addWidget(my_list_exText)

        tab2.h_box1=QHBoxLayout()
        tab2.h_box1.addLayout(tab2.v_box1)
        tab2.setLayout(tab2.h_box1)

        my_webpage.load(QUrl("https://google.com"))
        my_webpage.show()


# arrange Group Boxes vertically and Tab on the Right        
        v_box1=QVBoxLayout()
        v_box1.addWidget(my_groupbox1)
        v_box1.addWidget(my_groupbox2)
        v_box2=QVBoxLayout()
        v_box2.addWidget(my_tabWidget)
        h_box1=QHBoxLayout()
        h_box1.addLayout(v_box1)
        h_box1.addLayout(v_box2)   
        self.setLayout(h_box1)

        m = PlotCanvas(self.my_graphic, width=5, height=5, dpi=100,atest='xyz',sf=data_square)

# Fill the ComboBox of Countries
        my_sample_countries= ['Afghanistan','Bangladesh']
        for country in my_sample_countries:
            self.my_combo.addItem(country)

class PlotCanvas(FigureCanvas):

    def __init__(self, parent=None, width=5, height=4, dpi=100,atest='xyz',sf=data_square):



        fig = Figure(figsize=(width, height), dpi=dpi)

        axes = fig.add_subplot(111)
        axes.hold(False)

        FigureCanvas.__init__(self, fig)

        self.setParent(parent)

        FigureCanvas.setSizePolicy(self,
                QSizePolicy.Expanding,
                QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

        ax = self.figure.add_subplot(111)


        x = np.linspace(0, 3 * np.pi, 400)
        y = np.sin(x ** 3) 

        print('atest',atest)

        if atest=='abc':
            x = np.linspace(0, 2 * np.pi, 400)
            y = np.sin(x ** 2)
            print('A case')
        if atest=='def':
            x = np.linspace(0, 4 * np.pi, 400)
            y = np.sin(x ** 4)
            print('B case')

        ax.plot(x,y)        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 05 мая 2018

нужно вручную заставить рисовать фигуру

ax.figure.canvas.draw()
self.show()

Попробуйте:

import numpy as np
import sys
from PyQt5.QtCore import QUrl,QRect,QSize
from PyQt5.QtWebEngineWidgets import QWebEngineSettings, QWebEngineView, QWebEnginePage 
from PyQt5.QtWidgets import (QApplication, QMainWindow,QMenu,QHBoxLayout,QVBoxLayout,QFrame,QLabel,
        QSizePolicy, QMessageBox, QWidget, QPushButton,QRadioButton,
        QTextBrowser,QDialog,QGroupBox,QTabWidget,QComboBox,QListWidget)

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import shapefile as shp
import matplotlib.pyplot as plt

import random

data_square=[(0,0),(1,0),(1,1),(0,1),(0,0),(1,1)]
data_rectangle=[(0,0),(2,0),(2,1),(0,1),(0,0),(1,1)]

class MyBrowser(QWebEnginePage):

    def userAgentForUrl(self, url):
        return "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"

class Web(QWebEngineView):

    def load(self, url):
        self.setUrl(QUrl(url))

    def adjustTitle(self):
        self.setWindowTitle(self.title())

    def disableJS(self):
        settings = QWebEngineSettings.globalSettings()
        settings.setAttribute(QWebEngineSettings.JavascriptEnabled, False)




class App(QDialog):
    def __init__(self):
        super().__init__()
        self.title= 'Test Building PyQT5 with Tabs'
        self.left   =  40
        self.top    =  40
        self.width  = 400
        self.height = 100
        self.initUI()


    def initUI(self):        
        #self.setWindowTitle(self.title)
        #self.setGeometry(100,100,1000,800)
        #self.create_my_layout()
        #my_main_window_layout=QVBoxLayout()
        #self.setLayout(my_main_window_layout)
        #self.show()

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.create_my_layout()

        windowLayout = QVBoxLayout()
        #windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(windowLayout)

        self.show()

    def my_combo_active(self,index):
        my_specific_country = self.my_combo.itemText(index)
        if my_specific_country == 'Afghanistan':
            m = PlotCanvas(self.my_graphic, width=5, height=5, dpi=100,atest='abc',sf=data_square)
            print('A')
        if my_specific_country == 'Bangladesh':
            m = PlotCanvas(self.my_graphic, width=5, height=5, dpi=100,atest='def',sf=data_rectangle)
            print('B')


    def create_my_layout(self):
# Set up group boxes along left side of window
        my_groupbox1=QGroupBox('box 1')
        my_groupbox2=QGroupBox('box 2')

        my_button1=QRadioButton('a button')
        my_button1.setChecked(True)
        #radiobutton.toggled.connect(self.on_radio_button_toggled)
        my_button2=QRadioButton('another button')

        my_button5=QRadioButton('more button')
        my_button5.setChecked(True)
        my_button6=QRadioButton('even more button')

        v_box0=QVBoxLayout()
        v_box0.addWidget(my_button1)
        v_box0.addWidget(my_button2)
        my_groupbox1.setLayout(v_box0)

        v_box00=QVBoxLayout()
        v_box00.addWidget(my_button5)
        v_box00.addWidget(my_button6)
        my_groupbox2.setLayout(v_box00)



#set up Tab Widget to end up on right side   
        my_tabWidget=QTabWidget()
        tab1=QWidget()
        tab2=QWidget()

        my_tabWidget.addTab(tab1,"Tab 1")
        my_tabWidget.addTab(tab2,"Tab 2")



# Add To Tab 1
        my_label_country = QLabel('Country')
        my_label_country.setMaximumSize(QSize(1000,50))
        my_label_map = QLabel('Map')

        self.my_combo = QComboBox()
        self.my_combo.activated.connect(self.my_combo_active)
        self.my_graphic=QFrame()
        self.my_graphic.setMinimumSize(QSize(500,500))

        my_list1 = QListWidget()
        my_list2 = QListWidget()
        my_list3 = QListWidget()
        my_button_complete=QPushButton('')
        #my_list4=QListWidget()

        tab1.v_box1 = QVBoxLayout()
        tab1.v_box1.addWidget(self.my_combo)
        tab1.v_box1.addWidget(my_label_map)
        tab1.v_box1.addWidget(self.my_graphic)
        tab1.v_box1.addWidget(my_list1)

        tab1.v_box2 = QVBoxLayout()
        tab1.v_box2.addWidget(my_list2)

        tab1.v_box3 = QVBoxLayout()
        tab1.v_box3.addWidget(my_list3)
        tab1.v_box3.addWidget(my_button_complete)

        tab1.h_box1 = QHBoxLayout()
        tab1.h_box1.addLayout(tab1.v_box1)
        tab1.h_box1.addLayout(tab1.v_box2)
        tab1.h_box1.addLayout(tab1.v_box3)

        tab1.setLayout(tab1.h_box1)

# now add Elements to Tab 2 
        my_label_webpage=QLabel('A Web Page')
        my_label_webpage.setMaximumSize(QSize(1000,20))


        #my_combo=QComboBox()
# PC version
        #my_webpage=QWebView()
#Mac version
        my_webpage=Web()
        my_list_exText=QListWidget()



        tab2.v_box1=QVBoxLayout() 
        tab2.v_box1.addWidget(my_webpage)

        tab2.v_box2=QVBoxLayout()
        tab2.v_box2.addWidget(my_list_exText)

        tab2.h_box1=QHBoxLayout()
        tab2.h_box1.addLayout(tab2.v_box1)
        tab2.setLayout(tab2.h_box1)

        my_webpage.load(QUrl("https://google.com"))
        my_webpage.show()


# arrange Group Boxes vertically and Tab on the Right        
        v_box1=QVBoxLayout()
        v_box1.addWidget(my_groupbox1)
        v_box1.addWidget(my_groupbox2)
        v_box2=QVBoxLayout()
        v_box2.addWidget(my_tabWidget)
        h_box1=QHBoxLayout()
        h_box1.addLayout(v_box1)
        h_box1.addLayout(v_box2)   
        self.setLayout(h_box1)

        #m = PlotCanvas(self.my_graphic, width=5, height=5, dpi=100,atest='xyz',sf=data_square)
        m = PlotCanvas(self.my_graphic, width=5, height=5, dpi=100,atest='xyz',sf=data_square)

# Fill the ComboBox of Countries
        my_sample_countries= ['Afghanistan','Bangladesh']
        for country in my_sample_countries:
            self.my_combo.addItem(country)

class PlotCanvas(FigureCanvas):

    def __init__(self, parent=None, width=5, height=4, dpi=100, atest='xyz', sf=data_square):

        fig = Figure(figsize=(width, height), dpi=dpi)

        axes = fig.add_subplot(111)
        axes.hold(False)

        FigureCanvas.__init__(self, fig)

        self.setParent(parent)

        FigureCanvas.setSizePolicy(self,
                QSizePolicy.Expanding,
                QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

        ax = self.figure.add_subplot(111)


        x = np.linspace(0, 3 * np.pi, 400)
        y = np.sin(x ** 3) 

        print('atest', atest)

        if atest == 'abc':
            x = np.linspace(0, 2 * np.pi, 400)
            y = np.sin(x ** 2)
            print('A case')
        if atest == 'def':
            x = np.linspace(0, 4 * np.pi, 400)
            y = np.sin(x ** 4)
            print('B case')

        ax.plot(x,y)      
        # have to manually force a figure draw
        ax.figure.canvas.draw()     # +  
        self.show()                 # +       

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...