私は例をできるだけ短くするように努めました。SOにも同様の質問があります。上記の質問で提供された回答とは対照的に、コードを再利用できるようにMatplotlibFigureクラスを定義したいと思います。self.figure = MatplotlibFigure()
関数のようにFigureのインスタンスへの参照をmake_tab1
追加self.figure
し、に追加しましたsplitter
。ナビゲーションツールバーを使用して図を保存できるため、押しボタンは機能しているようです。ただし、軸はGUIに表示されません。
軸が表示されないのはなぜですか?
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QWidget, QAction, QTabWidget, QVBoxLayout,\
QHBoxLayout, QGridLayout, QSplitter, QFrame, QTextEdit, QFileDialog, QGroupBox,\
QButtonGroup, QLabel, QRadioButton
from PyQt5 import QtCore
import matplotlib
from matplotlib import figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
class MatplotlibFigure(QWidget):
# constructor
def __init__(self):
super().__init__()
#self.layout = QBoxLayout()
self.figure = matplotlib.figure.Figure()
self.canvas = FigureCanvas(self.figure)
self.toolbar = NavigationToolbar(self.canvas, self)
#self.layout.addWidget(self.canvas)
def plot(self):
self.figure.clf()
ax = self.figure.add_subplot(111)
x = [i for i in range(100)]
y = [i**0.5 for i in x]
ax.plot(x, y, 'g*-')
self.canvas.draw_idle()
print('PLOTTED')
class MainApp(QMainWindow):
""" This creates the main Window and configures its look
"""
def __init__(self):
'''
Initializes the class with standard parameters
'''
super().__init__()
self.title = 'Data Analysis App'
# start at top left corner of the screen
self.left = 0
self.top = 0
# set the window height and width
self.width = 1280
self.height = 780
# set the styles of fonts etc.
self.setStyleSheet('font-size: 16pt')
# call the makeUI method
self.makeUI()
def makeUI(self):
# set window geometry
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
# generate the tab layout
self.table_widget = MyTableWidget()
self.setCentralWidget(self.table_widget)
# apparently we have to call the show method in order to show it
self.show()
class MyTableWidget(QWidget):
"""
Initializes the tab layout
"""
def __init__(self):
super().__init__()
self.layout = QVBoxLayout(self)
# initialize the tab screens
self.tabs = QTabWidget()
# add the tab screens to the tab widget
self.tabs.resize(600, 600)
# make the layout of the tabs
self.make_tab1()
# initialize the tabs
self.layout.addWidget(self.tabs)
self.setLayout(self.layout)
def make_tab1(self):
"""Style of tab 1 is created here"""
'''Defines master layout of tab1'''
tab1 = QWidget()
tab1.layout = QHBoxLayout()
'''Button Section'''
# converts the data into excel and pandas dataframe
btn_plot_data = QPushButton('Plot data')
btn_plot_data.clicked.connect(self.plot_data)
'''Button layout section'''
btn_layout = QVBoxLayout()
btn_layout.addWidget(btn_plot_data)
btn_layout.addStretch(1)
'''Page layout section '''
left = QFrame()
left.setLayout(btn_layout)
self.figure = MatplotlibFigure()
# combine the buttons and the canvas in a splitter layout
splitter1 = QSplitter(QtCore.Qt.Horizontal)
splitter1.addWidget(left)
splitter1.addWidget(self.figure)
splitter1.setSizes([5, 400])
# add the last splitter to the layout
tab1.layout.addWidget(splitter1)
tab1.setLayout(tab1.layout)
self.tabs.addTab(tab1, 'Get Data Module')
''' Methods section
'''
def plot_data(self):
self.figure.plot()
if __name__ == '__main__':
""" This code block is always the same and makes sure that e.g. STRG+C kills the window etc.
"""
app = QApplication(sys.argv)
ex = MainApp()
sys.exit(app.exec())
MatplotlibFigureクラスのレイアウトを設定するのを忘れました(これは、キャンバスではなく、QWidgetであることに注意してください)。
def __init__(self):
super().__init__()
#self.layout = QBoxLayout()
self.figure = matplotlib.figure.Figure()
self.canvas = FigureCanvas(self.figure)
self.toolbar = NavigationToolbar(self.canvas, self)
layout = QVBoxLayout(self)
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加