PyQt5 - 使用新的 pandas DataFrame 更新 TableView 时出现问题
PyQt5 - Problem updating TableView with new pandas DataFrame
我有 PyQt5
应用程序生成 pandas 数据帧到 PyQt TableView
。数据帧是用函数 getPageInfo 生成的,它调用 class 生成 pandas数据框对象。
对于 QLineEdit()
的默认值,一切都很好,它是 class getPageInfo
的 URL 条目,它根据 [=50= 生成 pandas 数据帧] 输入。
from PyQt5.QtCore import QUrl
import sys
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
QMainWindow, QGridLayout)
from getURLPage import GetPage
from getPandas import PandasTableModel
class App(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
self.le = QLineEdit()
self.le.setText("https://www.samplesite.com/")
self.getdata = QPushButton()
self.getdata.setText("Show data")
self.getdata.clicked.connect(self.getPageInfo)
self.pdtable = QTableView()
self.model = PandasTableModel(self.getPageInfo())
self.pdtable.setModel(self.model)
self.pdtable.resize(800, 600)
self.grid = QGridLayout(centralWidget)
self.grid.addWidget(self.le, 0, 0)
self.grid.addWidget(self.getdata, 0, 1)
self.grid.addWidget(self.pdtable, 1, 0, 1, 0)
def getPageInfo(self):
self.siteURL = self.le.text()
getPage = GetPage(self.siteURL,
"data",
"page")
pageDF = getPage.getAdInfo()
return pageDF
if __name__ == "__main__":
app = QApplication(sys.argv)
box = App()
box.show()
sys.exit(app.exec_())
它很好地显示了搜索栏、按钮和 pandas 数据框,这些数据框是根据 QLineEdit()
的默认输入生成的,在本例中是 "https://www.samplesite.com/"
.
此 URL 是 getPageInfo
函数的输入,其中 returns PandasDataframe。
它也适用于任何其他默认输入。
问题是,如果用户在 QLineEdit()
中输入相同的 url 并按下 QPushButton()
.
,它就不起作用
函数实际上为用户给定的 URL 条目获取了新的 DataFrame,但它没有显示在 QTableView()
中
编辑:
我已将 self.model
的生成移动到 getPageInfo
函数,但现在出现错误:
self.pdtable.setModel(self.model)
AttributeError: 'App' object has no attribute 'model'
from PyQt5.QtCore import QUrl
import sys
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
QMainWindow, QGridLayout)
from getURLPage import GetPage
from getPandas import PandasTableModel
class App(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
self.le = QLineEdit()
self.le.setText("https://www.samplesite.com/")
self.getdata = QPushButton()
self.getdata.setText("Show data")
self.getdata.clicked.connect(self.getPageInfo)
self.pdtable = QTableView()
self.pdtable.setModel(self.model)
self.pdtable.resize(800, 600)
self.grid = QGridLayout(centralWidget)
self.grid.addWidget(self.le, 0, 0)
self.grid.addWidget(self.getdata, 0, 1)
self.grid.addWidget(self.pdtable, 1, 0, 1, 0)
def getPageInfo(self):
self.siteURL = self.le.text()
getPage = GetPage(self.siteURL,
"data",
"page")
pageDF = getPage.getAdInfo()
self.model = PandasTableModel(pageDF)
if __name__ == "__main__":
app = QApplication(sys.argv)
box = App()
box.show()
sys.exit(app.exec_())
这是可行的解决方案。
@Heike - 谢谢你的提示!
pandas 数据模型 (self.model
) 和 QTableView()
都需要在函数内部更新。
from PyQt5.QtCore import QUrl
import sys
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
QMainWindow, QGridLayout)
from getURLPage import GetPage
from getPandas import PandasTableModel
class App(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
self.le = QLineEdit()
self.le.setText("https://www.samplesite.com/")
self.getdata = QPushButton()
self.getdata.setText("Show data")
self.getdata.clicked.connect(self.getPageInfo)
self.pdtable = QTableView()
self.pdtable.resize(800, 600)
self.grid = QGridLayout(centralWidget)
self.grid.addWidget(self.le, 0, 0)
self.grid.addWidget(self.getdata, 0, 1)
self.grid.addWidget(self.pdtable, 1, 0, 1, 0)
def getPageInfo(self):
self.siteURL = self.le.text()
getPage = GetPage(self.siteURL,
"data",
"page")
pageDF = getPage.getAdInfo()
self.model = PandasTableModel(pageDF)
self.pdtable.setModel(self.model)
if __name__ == "__main__":
app = QApplication(sys.argv)
box = App()
box.show()
sys.exit(app.exec_())
我有 PyQt5
应用程序生成 pandas 数据帧到 PyQt TableView
。数据帧是用函数 getPageInfo 生成的,它调用 class 生成 pandas数据框对象。
对于 QLineEdit()
的默认值,一切都很好,它是 class getPageInfo
的 URL 条目,它根据 [=50= 生成 pandas 数据帧] 输入。
from PyQt5.QtCore import QUrl
import sys
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
QMainWindow, QGridLayout)
from getURLPage import GetPage
from getPandas import PandasTableModel
class App(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
self.le = QLineEdit()
self.le.setText("https://www.samplesite.com/")
self.getdata = QPushButton()
self.getdata.setText("Show data")
self.getdata.clicked.connect(self.getPageInfo)
self.pdtable = QTableView()
self.model = PandasTableModel(self.getPageInfo())
self.pdtable.setModel(self.model)
self.pdtable.resize(800, 600)
self.grid = QGridLayout(centralWidget)
self.grid.addWidget(self.le, 0, 0)
self.grid.addWidget(self.getdata, 0, 1)
self.grid.addWidget(self.pdtable, 1, 0, 1, 0)
def getPageInfo(self):
self.siteURL = self.le.text()
getPage = GetPage(self.siteURL,
"data",
"page")
pageDF = getPage.getAdInfo()
return pageDF
if __name__ == "__main__":
app = QApplication(sys.argv)
box = App()
box.show()
sys.exit(app.exec_())
它很好地显示了搜索栏、按钮和 pandas 数据框,这些数据框是根据 QLineEdit()
的默认输入生成的,在本例中是 "https://www.samplesite.com/"
.
此 URL 是 getPageInfo
函数的输入,其中 returns PandasDataframe。
它也适用于任何其他默认输入。
问题是,如果用户在 QLineEdit()
中输入相同的 url 并按下 QPushButton()
.
函数实际上为用户给定的 URL 条目获取了新的 DataFrame,但它没有显示在 QTableView()
编辑:
我已将 self.model
的生成移动到 getPageInfo
函数,但现在出现错误:
self.pdtable.setModel(self.model) AttributeError: 'App' object has no attribute 'model'
from PyQt5.QtCore import QUrl
import sys
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
QMainWindow, QGridLayout)
from getURLPage import GetPage
from getPandas import PandasTableModel
class App(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
self.le = QLineEdit()
self.le.setText("https://www.samplesite.com/")
self.getdata = QPushButton()
self.getdata.setText("Show data")
self.getdata.clicked.connect(self.getPageInfo)
self.pdtable = QTableView()
self.pdtable.setModel(self.model)
self.pdtable.resize(800, 600)
self.grid = QGridLayout(centralWidget)
self.grid.addWidget(self.le, 0, 0)
self.grid.addWidget(self.getdata, 0, 1)
self.grid.addWidget(self.pdtable, 1, 0, 1, 0)
def getPageInfo(self):
self.siteURL = self.le.text()
getPage = GetPage(self.siteURL,
"data",
"page")
pageDF = getPage.getAdInfo()
self.model = PandasTableModel(pageDF)
if __name__ == "__main__":
app = QApplication(sys.argv)
box = App()
box.show()
sys.exit(app.exec_())
这是可行的解决方案。 @Heike - 谢谢你的提示!
pandas 数据模型 (self.model
) 和 QTableView()
都需要在函数内部更新。
from PyQt5.QtCore import QUrl
import sys
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
QMainWindow, QGridLayout)
from getURLPage import GetPage
from getPandas import PandasTableModel
class App(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
self.le = QLineEdit()
self.le.setText("https://www.samplesite.com/")
self.getdata = QPushButton()
self.getdata.setText("Show data")
self.getdata.clicked.connect(self.getPageInfo)
self.pdtable = QTableView()
self.pdtable.resize(800, 600)
self.grid = QGridLayout(centralWidget)
self.grid.addWidget(self.le, 0, 0)
self.grid.addWidget(self.getdata, 0, 1)
self.grid.addWidget(self.pdtable, 1, 0, 1, 0)
def getPageInfo(self):
self.siteURL = self.le.text()
getPage = GetPage(self.siteURL,
"data",
"page")
pageDF = getPage.getAdInfo()
self.model = PandasTableModel(pageDF)
self.pdtable.setModel(self.model)
if __name__ == "__main__":
app = QApplication(sys.argv)
box = App()
box.show()
sys.exit(app.exec_())