Экспорт данных QTableWidgets, заполненных пользователем, в файл 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()))

это сработало, 1 проблема не работает. Спасибо !
everything == вся информация внутри QTableWidget. (заголовки, элементы, ...)
та же логика, что и у pandas, где заголовки - это ключи, а элементы - это, например, значения. example_dict = {"название заголовка": [item1, item2, item3, ....],}
Я знаю, что у меня проблемы со связью, так что терпи меня, пожалуйста
@eyllanesc отметил.
@eyllanesc, пожалуйста, объясните мне этот код?
@ user10567350, пожалуйста, если вы спросите о моем решении, сделайте это в разделе под моим ответом, как было, и я не знаю, почему вы его удалили.
@eyllanesc я не мог отметить тебя
@ user10567350 тег используется, когда есть более двух разных пользователей, здесь 3 пользователя: вы, С.Ник и я, так что если вы напишете, кто уведомит? не известно, что с помощью тега можно различать, это тот случай, когда мы 2 в этом нет необходимости.






Используя pandas, задача проста, решение состоит в том, чтобы преобразовать QTableWidget в фрейм данных, а затем экспортировать его:
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 (эти 2 шага, я думаю, вы должны это знать, поскольку вы упомянули панды)
@ user10567350 Есть еще вопросы? Если мой ответ вам поможет, не забудьте отметить его как правильный, если вы не знаете, как это сделать, просмотрите тур, это лучший способ поблагодарить.
Да, у меня вопрос. Почему возврат QinputDialog пуст?
@ user10567350 Почему вы говорите, что QinputDialog пуст?
нет, извините, я говорю о QMessageBox || если продолжить! = QtWidgets.QMessageBox.Yes: return || (ваше кодирование продвинуто для моего уровня) и почему! =, а не ==?
@ user10567350 Если пользователь указывает, что он не хочет что-то делать, чтобы он продолжал что-то делать, лучше оставить функцию с помощью return, не так ли? Таким образом, мы избегаем множества вложений, если у вас более читаемый код, если вы не хотите что-то делать, когда пользователь говорит «нет». Не забудьте отметить мой ответ как правильный.
да, ваша точка зрения верна, я только что попробовал ваш код, и он создает файл, но без расширения, это нормально?
@ user10567350 в диалоговом окне необходимо разместить расширение, например mydb.db. Ты сделал это?
Я начинаю понимать ваш код, в чем польза: 1) - «table_name» в self.savetodb (filename, «table_name») ||| 2) - имя таблицы в def savetodb (self, db_filename, tablename) |||
@ user10567350 Знаете ли вы что-нибудь о пандах? Я предполагаю, что, поскольку вы комментировали, вы должны знать, как использовать to_sql (), для которого требуется имя таблицы, и просто «table_name» - это имя таблицы, которую вы используете по умолчанию.
я еще не дошел до этого момента, но спасибо, что сообщили мне: D, в любом случае ваш код идеален, и спасибо за вашу помощь
заменить
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 :')