feat: more classes

change pg and category to class
This commit is contained in:
iridiumR 2023-05-22 11:02:33 +08:00
parent b12807031a
commit ce1c8c6df8
No known key found for this signature in database
GPG key ID: 49735733EB1A32C8
5 changed files with 171 additions and 106 deletions

View file

@ -1,15 +1,13 @@
from PyQt6.QtWidgets import * from PyQt6.QtWidgets import *
from PyQt6.QtCore import * from PyQt6.QtCore import *
class MainWindow(QMainWindow): from ._pg import PostgresTab
cur = None class MainWindow(QMainWindow):
conn = None
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.initUI() self.initUI()
from ._mw import initUI from ._mw import initUI, onTabChanged
from ._pg import connectToDatabase, disconnectFromDatabase, onConnectClicked, initConnectTab from ._category import CategoryTab
from ._category import initCategorytTab, onCategoryAddClicked

View file

@ -1,30 +1,33 @@
from PyQt6.QtWidgets import * from PyQt6.QtWidgets import *
from ._tab import TabPage
from ._pg import PostgresTab
import json import json
def initCategorytTab(self): class CategoryTab(TabPage):
# 创建连接信息控件 def __init__(self, parent):
self.categoryComboBox = QComboBox() super().__init__()
self.initUI()
self.categoryAddButton = QPushButton('Add New Category') self.pg = parent.pg
self.categoryAddButton.clicked.connect(self.onCategoryAddClicked) self.rows = []
# 创建控件布局 def initUI(self):
categoryLayout = QHBoxLayout() # 创建连接信息控件
categoryLayout.addWidget(self.categoryComboBox) self.categoryComboBox = QComboBox()
categoryLayout.addWidget(self.categoryAddButton)
self.categoryAddButton = QPushButton('Add New Category')
# 连接信号槽 self.categoryAddButton.clicked.connect(self.onCategoryAddClicked)
# self.connectButton.clicked.connect(self.onConnectClicked)
categoryWidget = QWidget() # 创建控件布局
categoryWidget.setLayout(categoryLayout) categoryLayout = QHBoxLayout()
return categoryWidget categoryLayout.addWidget(self.categoryComboBox)
categoryLayout.addWidget(self.categoryAddButton)
categoryWidget = QWidget()
self.setLayout(categoryLayout)
def onCategoryAddClicked(self): def onCategoryAddClicked(self):
try:
if (self.cur is None):
raise Exception('Not connected to database')
# 创建添加数据对话框 # 创建添加数据对话框
addDialog = QDialog(self) addDialog = QDialog(self)
@ -76,14 +79,29 @@ def onCategoryAddClicked(self):
data = {"name": line1.text(), "income_type": type, "description": description} data = {"name": line1.text(), "income_type": type, "description": description}
data = json.dumps(data) data = json.dumps(data)
print("insert data:",data) print("insert data:",data)
self.cur.execute("INSERT INTO category (meta) VALUES (%s)", (data,))
self.conn.commit() self.pg.execute("INSERT INTO category (meta) VALUES (%s)", (data,))
# 刷新表格
self.selected()
except Exception as e: except Exception as e:
# 处理插入数据错误 # 处理插入数据错误
print(e) print(e)
QMessageBox.critical(self, 'Error', str(e)) QMessageBox.critical(self, 'Error', str(e))
except Exception as e:
# 处理获取表格列名错误
print(e) def selected(self):
QMessageBox.critical(self, 'Error', str(e)) # 清空表格
self.categoryComboBox.clear()
# 获取表格列名
try:
self.pg.execute("SELECT c_id, meta ->> 'name' FROM category ORDER BY c_id")
self.rows = self.pg.cur.fetchall()
print(self.rows)
for row in self.rows:
data = row[1]
self.categoryComboBox.addItem(data)
except Exception as e:
print(e)
QMessageBox.critical(self, 'Error', str(e))

View file

@ -1,18 +1,27 @@
from PyQt6.QtWidgets import * from PyQt6.QtWidgets import *
from ._pg import initConnectTab from ._pg import PostgresTab
from ._category import initCategorytTab from ._category import CategoryTab
from ._pg import PostgresTab
def initUI(self): def initUI(self):
self.setWindowTitle('budget') self.setWindowTitle('budget')
self.setGeometry(100, 100, 800, 600) self.setGeometry(100, 100, 800, 600)
connectTab = initConnectTab(self) self.pg = PostgresTab()
categoryTab = initCategorytTab(self) self.categoryTab = CategoryTab(self)
# 创建主窗口tab布局 # 创建主窗口tab布局
mainWidget = QTabWidget() mainWidget = QTabWidget()
mainWidget.addTab(connectTab, 'Connect') mainWidget.addTab(self.pg, 'Connect')
mainWidget.addTab(categoryTab, 'Category') mainWidget.addTab(self.categoryTab, 'Category')
mainWidget.currentChanged.connect(self.onTabChanged)
self.setCentralWidget(mainWidget) self.setCentralWidget(mainWidget)
self.pg.onConnectClicked()
def onTabChanged(self, index):
if (index == 1):
self.centralWidget().widget(index).selected()

View file

@ -1,84 +1,114 @@
from PyQt6.QtWidgets import * from PyQt6.QtWidgets import *
import psycopg2 import psycopg2
from ._tab import TabPage
def connectToDatabase(self): class PostgresTab(TabPage):
try: def __init__(self):
self.conn = psycopg2.connect(database=self.dbName, user=self.user, password=self.password, host=self.host, port=self.port) super().__init__()
self.cur = self.conn.cursor() self.initUI()
except Exception as e:
print(e)
self.cur = None
QMessageBox.critical(self, 'Error', str(e))
def disconnectFromDatabase(self): cur = None
try: conn = None
if (self.cur is None):
raise Exception('Not connected to database') def connected(self):
self.cur.close() return self.cur is not None
self.conn.close()
self.cur = None
except Exception as e: def execute(self,text,values=None):
print(e) try:
QMessageBox.critical(self, 'Error', str(e)) if (self.cur is None):
raise Exception('Not connected to database')
self.cur.execute(text,values)
self.conn.commit()
except Exception as e:
print(e)
QMessageBox.critical(self, 'Error', str(e))
def fetchall(self):
try:
if (self.cur is None):
raise Exception('Not connected to database')
return self.cur.fetchall()
except Exception as e:
print(e)
QMessageBox.critical(self, 'Error', str(e))
def connectToDatabase(self):
try:
self.conn = psycopg2.connect(database=self.dbName, user=self.user, password=self.password, host=self.host, port=self.port)
self.cur = self.conn.cursor()
except Exception as e:
print(e)
self.cur = None
QMessageBox.critical(self, 'Error', str(e))
def disconnectFromDatabase(self):
try:
if (self.cur is None):
raise Exception('Not connected to database')
self.cur.close()
self.conn.close()
self.cur = None
except Exception as e:
print(e)
QMessageBox.critical(self, 'Error', str(e))
def onConnectClicked(self): def onConnectClicked(self):
if self.connectButton.text() == 'Connect': if self.connectButton.text() == 'Connect':
self.host = self.hostLineEdit.text() self.host = self.hostLineEdit.text()
self.port = self.portLineEdit.text() self.port = self.portLineEdit.text()
self.dbName = self.dbNameLineEdit.text() self.dbName = self.dbNameLineEdit.text()
self.user = self.userLineEdit.text() self.user = self.userLineEdit.text()
self.password = self.passwordLineEdit.text() self.password = self.passwordLineEdit.text()
# 连接到 PostgreSQL 数据库 # 连接到 PostgreSQL 数据库
self.connectToDatabase() self.connectToDatabase()
self.connectButton.setText('Disconnect') self.connectButton.setText('Disconnect')
else: else:
self.disconnectFromDatabase() self.disconnectFromDatabase()
self.connectButton.setText('Connect') self.connectButton.setText('Connect')
def initConnectTab(self): def initUI(self):
# 创建连接信息控件 # 创建连接信息控件
self.hostLabel = QLabel('Host:') self.hostLabel = QLabel('Host:')
self.hostLineEdit = QLineEdit() self.hostLineEdit = QLineEdit()
self.hostLineEdit.setText('159.75.75.169') self.hostLineEdit.setText('159.75.75.169')
self.portLabel = QLabel('Port:') self.portLabel = QLabel('Port:')
self.portLineEdit = QLineEdit() self.portLineEdit = QLineEdit()
self.portLineEdit.setText('5432') self.portLineEdit.setText('5432')
self.dbNameLabel = QLabel('Database:') self.dbNameLabel = QLabel('Database:')
self.dbNameLineEdit = QLineEdit() self.dbNameLineEdit = QLineEdit()
self.dbNameLineEdit.setText('budget') self.dbNameLineEdit.setText('budget')
self.userLabel = QLabel('Username:') self.userLabel = QLabel('Username:')
self.userLineEdit = QLineEdit() self.userLineEdit = QLineEdit()
self.userLineEdit.setText('budget') self.userLineEdit.setText('budget')
self.passwordLabel = QLabel('Password:') self.passwordLabel = QLabel('Password:')
self.passwordLineEdit = QLineEdit() self.passwordLineEdit = QLineEdit()
self.passwordLineEdit.setEchoMode(QLineEdit.EchoMode.Password) self.passwordLineEdit.setEchoMode(QLineEdit.EchoMode.Password)
self.passwordLineEdit.setText('budget') self.passwordLineEdit.setText('budget')
self.connectButton = QPushButton('Connect') self.connectButton = QPushButton('Connect')
# 连接信号槽 # 连接信号槽
self.connectButton.clicked.connect(self.onConnectClicked) self.connectButton.clicked.connect(self.onConnectClicked)
# 创建连接信息控件布局 # 创建连接信息控件布局
connectLayout = QHBoxLayout() connectLayout = QHBoxLayout()
connectLayout.addWidget(self.hostLabel) connectLayout.addWidget(self.hostLabel)
connectLayout.addWidget(self.hostLineEdit) connectLayout.addWidget(self.hostLineEdit)
connectLayout.addWidget(self.portLabel) connectLayout.addWidget(self.portLabel)
connectLayout.addWidget(self.portLineEdit) connectLayout.addWidget(self.portLineEdit)
connectLayout.addWidget(self.dbNameLabel) connectLayout.addWidget(self.dbNameLabel)
connectLayout.addWidget(self.dbNameLineEdit) connectLayout.addWidget(self.dbNameLineEdit)
connectLayout.addWidget(self.userLabel) connectLayout.addWidget(self.userLabel)
connectLayout.addWidget(self.userLineEdit) connectLayout.addWidget(self.userLineEdit)
connectLayout.addWidget(self.passwordLabel) connectLayout.addWidget(self.passwordLabel)
connectLayout.addWidget(self.passwordLineEdit) connectLayout.addWidget(self.passwordLineEdit)
connectLayout.addWidget(self.connectButton) connectLayout.addWidget(self.connectButton)
connectWidget = QWidget() self.setLayout(connectLayout)
connectWidget.setLayout(connectLayout)
return connectWidget

10
src/budget/_tab.py Normal file
View file

@ -0,0 +1,10 @@
from PyQt6.QtWidgets import *
import psycopg2
class TabPage(QWidget):
def __init__(self):
super().__init__()
def selected(self):
pass