将 QTABLEWIDGET 的数据(列、行、所有内容……)导出到 SQLITE3
Posted
技术标签:
【中文标题】将 QTABLEWIDGET 的数据(列、行、所有内容……)导出到 SQLITE3【英文标题】:Export QTABLEWIDGET's data (Columns, rows , everything, ...) to SQLITE3 【发布时间】:2018-10-28 20:00:39 【问题描述】:导出QTableWidget
s 用户填充的数据到 db 文件。 (db 文件不存在,因此 SQLITE3 将在引用的目录中创建它。)
这是我使用的代码:
self.CreateDatasetButton.connect(self.createDS)
def CreateDS(self):
self.proceed = QtWidgets.QMessageBox.question(
self,
'Information',
'Have you Verified your Data?',
QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
if self.proceed == QtWidgets.QMessageBox.Yes:
self.showDialog()
else:
pass
def showDialog(self):
self.text, ok = QtWidgets.QInputDialog.getText(self, 'Almost Done !',
'\n\nname your file :')
if ok:
self.Createdb()
def Createdb(self):
conn = sqlite3.connect('__Datasets__/%s.db' %(self.text))
# problema here
conn.close()
self.app_statusbar.showMessage('%s is created' %(self.text()))
【问题讨论】:
将ok, self.text = QtWidgets.QInputDialog.getText(self, 'Almost Done !', '\n\nname your file :')
更改为self.text, ok = QtWidgets.QInputDialog.getText(self, 'Almost Done !', '\n\nname your file :')
成功了,解决了 1 个问题。谢谢!
everything == QTableWidget 中的所有信息。( Headers, items, ... )
与 pandas 的逻辑相同,例如,标题是键,项目是值。 example_dict = "标题名称" : [item1, item2, item3, ....],
我知道我有沟通问题,所以请多多包涵
【参考方案1】:
使用pandas任务很简单,解决方法是将QTableWidget转成dataframe然后导出:
import sqlite3
import pandas as pd
from PyQt5 import QtWidgets
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.table_widget = QtWidgets.QTableWidget()
self.create_data()
button = QtWidgets.QPushButton("Export")
button.clicked.connect(self.on_clicked)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.table_widget)
lay.addWidget(button)
def create_data(self):
self.table_widget.setColumnCount(4)
self.table_widget.setRowCount(10)
self.table_widget.setHorizontalHeaderLabels(["A", "B", "C", "D"])
import random
for i in range(self.table_widget.rowCount()):
for j in range(self.table_widget.columnCount()):
it = QtWidgets.QTableWidgetItem(str(random.randint(0, 100)))
self.table_widget.setItem(i, j, it)
def on_clicked(self):
proceed = QtWidgets.QMessageBox.question(self,
'Information',
'Have you Verified your Data?',
QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
if proceed != QtWidgets.QMessageBox.Yes:
return
filename, ok = QtWidgets.QInputDialog.getText(self, 'Almost Done !', 'name your file :')
if ok:
self.saveToDb(filename, "table_name")
def saveToDb(self, db_filename, tablename):
d =
for i in range(self.table_widget.columnCount()):
l = []
for j in range(self.table_widget.rowCount()):
it = self.table_widget.item(j, i)
l.append(it.text() if it is not None else "")
h_item = self.table_widget.horizontalHeaderItem(i)
n_column = str(i) if h_item is None else h_item.text()
d[n_column] = l
df = pd.DataFrame(data=d)
engine = sqlite3.connect(db_filename)
df.to_sql(tablename, con=engine)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
【讨论】:
@user10567350 最好分析一下解决方案,当你不明白的时候可以问我一个具体的问题,在下面的评论中我将尝试以通用的方式解释它。跨度> @user10567350 策略是获取列表的字典,其中键是列的名称,列表具有与每列下的项目关联的值。为了获得 QTableWidgetItem 我使用了一个项目,但在一般情况下,项目可以为空,所以我检查,如果是,那么我保留一个空字符串,如果不是,我保存文本。创建列表字典后,创建一个数据框并将其导出到 sqlite(这两个步骤我认为您应该知道,因为您提到了熊猫) @user10567350 还有其他问题吗?如果我的回答对您有帮助,别忘了标记为正确,如果您不知道怎么做,请查看tour,这是最好的感谢方式。 是的,我有一个问题。为什么QinputDialog的返回是空的? @user10567350 为什么说QinputDialog是空的?以上是关于将 QTABLEWIDGET 的数据(列、行、所有内容……)导出到 SQLITE3的主要内容,如果未能解决你的问题,请参考以下文章