我在Qt设计器中创建了一个带有两个按钮和表格视图的简单窗口,然后将用户界面另存为 user_interface.ui 。 kotlin-android Gradle plugin docs是用户界面。
然后,我使用以下代码生成一些随机数据,然后单击 Generate data and display (单击并显示它们)在窗口上显示它们。我还有一个保存按钮,可让用户选择将生成的数据另存为csv:
import sys
import pandas as pd
from numpy.random import randn
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
ui,_=loadUiType('user_interface.ui')
class MainApp(QMainWindow, ui):
def __init__(self, parent=None):
QMainWindow.__init__(self)
self.setupUi(self)
self.generate_table.clicked.connect(self.generate_data)
def generate_data(self):
df = pd.DataFrame(randn(5,4),index='A B C D E'.split(),columns='W X Y Z'.split())
model = pandasModel(df)
self.tableView.setModel(model)
self.save_as_csv.clicked.connect(lambda: self.save_data_as_csv(df))
def save_data_as_csv(self, df):
name = QFileDialog.getSaveFileName(self, 'Save File', filter='*.csv')
if(name[0] == ''):
pass
else:
df.to_csv(name[0], index = False)
class pandasModel(QAbstractTableModel):
def __init__(self, data):
QAbstractTableModel.__init__(self)
self._data = data
def rowCount(self, parent=None):
return self._data.shape[0]
def columnCount(self, parnet=None):
return self._data.shape[1]
def data(self, index, role=Qt.DisplayRole):
if index.isValid():
if role == Qt.DisplayRole:
return str(self._data.iloc[index.row(), index.column()])
return None
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self._data.columns[col]
return None
def main():
app=QApplication(sys.argv)
QApplication.processEvents()
window = MainApp()
window.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
当我点击 Generate data and display 按钮时,它工作正常,我看到了生成的表格。如果我一直按此按钮,我确实会看到随机数发生变化,这正是我想要的。
问题是,当我要保存生成的数据时,如果单击20次 Generate data and display 来更改数据,则会要求我20次(除非我在“保存”弹出窗口中单击“取消”,否则它基本上是试图保存每次 生成数据并显示 按钮。我要保存的只是我点击 另存为csv 按钮之前最新生成的数据。我不知道该怎么做才能实现这一目标?
答案 0 :(得分:1)
之所以会这样,是因为每次调用save_data_as_csv
时,信号的另一个实例都连接到generate_data
。而是在构造函数中声明一次信号连接,并保留指向类(self.df
)中最新数据帧的指针,因此不再需要将数据帧作为参数传递。
class MainApp(QMainWindow, ui):
def __init__(self, parent=None):
QMainWindow.__init__(self)
self.setupUi(self)
self.generate_table.clicked.connect(self.generate_data)
self.save_as_csv.clicked.connect(self.save_data_as_csv)
def generate_data(self):
self.df = pd.DataFrame(randn(5,4),index='A B C D E'.split(),columns='W X Y Z'.split())
model = pandasModel(self.df)
self.tableView.setModel(model)
def save_data_as_csv(self):
name = QFileDialog.getSaveFileName(self, 'Save File', filter='*.csv')
if(name[0] == ''):
pass
else:
self.df.to_csv(name[0], index = False)