我正在使用 PyQt5 在 python 中構建一個 GUI。資料使用匯入on_pushButtonLoad_clicked()并get_file()位于TabWidget.
我的目標是:
- 將此資料(匯入檔案)傳輸到
FirstTab() MRChart(importedfile)使用最近匯入的資料更新繪圖。
我已經完成了將資料傳輸到FirstTab()生成圖的第一個目標,并且可以在瀏覽器中使用fig.show(). 雖然MRChart(importedfile)連接到繪圖插件energy()通過self.browser,圖中未能在GUI中顯示。
代碼:
class TabWidget(QDialog):
def __init__(self, data):
super(TabWidget, self).__init__()
self.data = data
self.showMaximized()
#create filter object
FilterLayout = QHBoxLayout()
FilterLayout.addWidget(self.createHeader1a(), 2)#column width
#create tab widget object
tabwidget = QTabWidget()
tabwidget.addTab(FirstTab(self.data), "Tab 1")
vbox = QVBoxLayout()
vbox.addLayout(FilterLayout)
vbox.addWidget(tabwidget)
self.setLayout(vbox)
def createHeader1a(self): # function defining characteristics of each group/grid object
HeaderBox = QGroupBox("Import Data")
inputfilebtn = QPushButton("Import")
inputfilebtn.resize(150, 50)
inputfilebtn.clicked.connect(self.on_pushButtonLoad_clicked)
#importrow1
importrow1layout = QHBoxLayout()
importrow1layout.addWidget(inputfilebtn)
importrow1layout.addStretch()
HeaderLayout = QGridLayout()
HeaderLayout.addLayout(importrow1layout, 0, 1)
HeaderBox.setLayout(HeaderLayout)
HeaderBox.setFlat(True)
return HeaderBox
def getfile(self):
option = QFileDialog.Options()
fname = QFileDialog.getOpenFileName(self, 'Open file',
'c:\\', "CSV files (*.csv)", options=option)
global importedfile
importedfile = pd.read_csv(fname[0])
@QtCore.pyqtSlot()
def on_pushButtonLoad_clicked(self):
self.getfile()
FT=FirstTab(data=importedfile)
FT.MRChart(importedfile)
class FirstTab(QWidget):
def __init__(self, data):
super(FirstTab, self).__init__()
self.data = data
# Grid layout of entire tab
layout = QGridLayout()
layout.addWidget(self.energy(), 3, 0)
layout.setRowStretch(3, 3)
layout.setColumnStretch(0, 1)
self.setLayout(layout)
def MRChart(self, importedfile): # pie
fig = go.Pie(labels=importedfile["Label1"], values=importedfile["Label2"])
layout = go.Layout(autosize=True, legend=dict(orientation="h",xanchor='center', x=0.5))# height = 600, width = 1000,
fig = go.Figure(data=fig, layout=layout)
fig.update_layout(margin=dict(t=0, b=0, l=0, r=0))
fig.show()# only included to prove that figure has been created
self.browser.setHtml(fig.to_html(include_plotlyjs='cdn'))
def energy(self):
groupBox = QGroupBox("Box Title")
self.browser = QtWebEngineWidgets.QWebEngineView(self)
exportfilebtn = QCheckBox("tickbox1")
middleright = QHBoxLayout()
middleright.addWidget(self.browser)
middleright.addWidget(exportfilebtn)
groupBox.setLayout(middleright)
groupBox.setFlat(True)
return groupBox
if __name__ == "__main__":
app = QApplication(sys.argv)
tabwidget = TabWidget(data=None)
tabwidget.show()
app.exec()
根據音樂家的回答更新了代碼
class TabWidget(QDialog):
def __init__(self, data):
super(TabWidget, self).__init__()
self.data = data
self.firstTab = FirstTab(self.data)
#create filter object
FilterLayout = QHBoxLayout()
FilterLayout.addWidget(self.createHeader1a(), 2)#column width
#create tab widget object
tabwidget = QTabWidget()
tabwidget.addTab(self.firstTab "Tab 1")
vbox = QVBoxLayout()
vbox.addLayout(FilterLayout)
vbox.addWidget(tabwidget)
self.setLayout(vbox)
def createHeader1a(self): # function defining characteristics of each group/grid object
HeaderBox = QGroupBox("Import Data")
inputfilebtn = QPushButton("Import")
inputfilebtn.resize(150, 50)
inputfilebtn.clicked.connect(self.on_pushButtonLoad_clicked)
#importrow1
importrow1layout = QHBoxLayout()
importrow1layout.addWidget(inputfilebtn)
importrow1layout.addStretch()
HeaderLayout = QGridLayout()
HeaderLayout.addLayout(importrow1layout, 0, 1)
HeaderBox.setLayout(HeaderLayout)
HeaderBox.setFlat(True)
return HeaderBox
def getfile(self):
option = QFileDialog.Options()
fname = QFileDialog.getOpenFileName(self, 'Open file',
'c:\\', "CSV files (*.csv)", options=option)
return pd.read_csv(fname[0])
@QtCore.pyqtSlot()
def on_pushButtonLoad_clicked(self):
importedfile = self.getfile()
if importedfile is None:
return
self.firstTab.MRChart(importedfile)
class FirstTab(QWidget):
def __init__(self, data):
super(FirstTab, self).__init__()
self.data = data
# Grid layout of entire tab
layout = QGridLayout()
layout.addWidget(self.energy(), 3, 0)
layout.setRowStretch(3, 3)
layout.setColumnStretch(0, 1)
self.setLayout(layout)
def MRChart(self, importedfile): # pie
fig = go.Pie(labels=importedfile["Label1"], values=importedfile["Label2"])
layout = go.Layout(autosize=True, legend=dict(orientation="h",xanchor='center', x=0.5))# height = 600, width = 1000,
fig = go.Figure(data=fig, layout=layout)
fig.update_layout(margin=dict(t=0, b=0, l=0, r=0))
fig.show()# only included to provde figure is created
self.browser.setHtml(fig.to_html(include_plotlyjs='cdn'))
def energy(self):
groupBox = QGroupBox("Box Title")
self.browser = QtWebEngineWidgets.QWebEngineView(self)
exportfilebtn = QCheckBox("tickbox1")
middleright = QHBoxLayout()
middleright.addWidget(self.browser)
middleright.addWidget(exportfilebtn)
groupBox.setLayout(middleright)
groupBox.setFlat(True)
return groupBox
if __name__ == "__main__":
app = QApplication(sys.argv)
tabwidget = TabWidget(data=None)
tabwidget.show()
app.exec()
uj5u.com熱心網友回復:
您正在創建 的新實體FirstTab,而不是使用現有實體。
您必須保留對第一個實體的參考,然后呼叫它的 MRChart函式。
此外,你應該不使用全域變數:getfile()應回傳的值,你應該使用在回傳的值on_pushButtonLoad_clicked。
class TabWidget(QDialog):
def __init__(self, data):
# ...
self.firstTab = FirstTab(self.data)
tabwidget.addTab(self.firstTab, "Tab 1")
# ...
def getfile(self):
option = QFileDialog.Options()
fname, _ = QFileDialog.getOpenFileName(self, 'Open file',
'c:\\', "CSV files (*.csv)", options=option)
if fname:
return pd.read_csv(fname)
@QtCore.pyqtSlot()
def on_pushButtonLoad_clicked(self):
importedfile = self.getfile()
if importedfile is None:
return
self.firstTab.MRChart(importedfile)
請注意,這是很好的做法,顯示視窗只后把它的元素,這也是通常最好不叫show*()的__init__。resize()在添加到布局的小部件上使用也是沒有意義的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/407441.html
標籤:
