我编写了一个代码来与币安上的硬币价格数据进行交互,该程序接收一个包含所有硬币价值的.json
文件作为输入。
之后它将这些数据加载到第二个表中。
用户必须输入公式,lineEdit并且公式及其结果应该出现在第二个表中,但由于某种原因,即使对于正确的公式,代码也会返回错误。
如何修复这个问题?
BinanceTracker.py:
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QTableWidgetItem, QMessageBox
from data_loader import load_data_to_table # Import the data loader
class Ui_BinanceTracker(object):
def setupUi(self, BinanceTracker):
BinanceTracker.setObjectName("BinanceTracker")
BinanceTracker.resize(640, 480)
BinanceTracker.setStyleSheet("QPushButton {\n"
" height: 50px; \n"
" width: 120px;\n"
" font: 9pt \"Segoe UI\";\n"
"}\n"
"QLineEdit {\n"
" height: 50px; \n"
" width: 120px; \n"
" font: 9pt \"Segoe UI\";\n"
"}\n"
"")
self.centralwidget = QtWidgets.QWidget(parent=BinanceTracker)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.tabWidget = QtWidgets.QTabWidget(parent=self.centralwidget)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.gridLayout_2 = QtWidgets.QGridLayout(self.tab)
self.gridLayout_2.setObjectName("gridLayout_2")
self.tableWidget = QtWidgets.QTableWidget(parent=self.tab)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(2)
self.tableWidget.setHorizontalHeaderLabels(["Формула", "Результат"])
self.tableWidget.setRowCount(0)
self.gridLayout_2.addWidget(self.tableWidget, 0, 0, 1, 2)
self.groupBox = QtWidgets.QGroupBox(parent=self.tab)
self.groupBox.setObjectName("groupBox")
self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout_4.setObjectName("gridLayout_4")
self.lineEdit = QtWidgets.QLineEdit(parent=self.groupBox)
self.lineEdit.setObjectName("lineEdit")
self.gridLayout_4.addWidget(self.lineEdit, 0, 0, 1, 1)
self.pushButton = QtWidgets.QPushButton(parent=self.groupBox)
self.pushButton.setObjectName("pushButton")
self.gridLayout_4.addWidget(self.pushButton, 0, 1, 1, 1)
self.pushButton_3 = QtWidgets.QPushButton(parent=self.groupBox)
self.pushButton_3.setObjectName("pushButton_3")
self.gridLayout_4.addWidget(self.pushButton_3, 0, 2, 1, 1)
self.gridLayout_2.addWidget(self.groupBox, 1, 0, 1, 2)
self.groupBox_2 = QtWidgets.QGroupBox(parent=self.tab)
self.groupBox_2.setObjectName("groupBox_2")
self.gridLayout_5 = QtWidgets.QGridLayout(self.groupBox_2)
self.gridLayout_5.setObjectName("gridLayout_5")
self.lineEdit_2 = QtWidgets.QLineEdit(parent=self.groupBox_2)
self.lineEdit_2.setObjectName("lineEdit_2")
self.gridLayout_5.addWidget(self.lineEdit_2, 0, 0, 1, 1)
self.lineEdit_3 = QtWidgets.QLineEdit(parent=self.groupBox_2)
self.lineEdit_3.setObjectName("lineEdit_3")
self.gridLayout_5.addWidget(self.lineEdit_3, 0, 1, 1, 1)
self.pushButton_2 = QtWidgets.QPushButton(parent=self.groupBox_2)
self.pushButton_2.setObjectName("pushButton_2")
self.gridLayout_5.addWidget(self.pushButton_2, 0, 2, 1, 1)
self.gridLayout_2.addWidget(self.groupBox_2, 2, 0, 1, 2)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.gridLayout_3 = QtWidgets.QGridLayout(self.tab_2)
self.gridLayout_3.setObjectName("gridLayout_3")
self.tableWidget_2 = QtWidgets.QTableWidget(parent=self.tab_2)
self.tableWidget_2.setObjectName("tableWidget_2")
self.tableWidget_2.setColumnCount(2)
self.tableWidget_2.setHorizontalHeaderLabels(["Пара", "Цена"])
self.tableWidget_2.setRowCount(0)
self.gridLayout_3.addWidget(self.tableWidget_2, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab_2, "")
self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
BinanceTracker.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=BinanceTracker)
self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 22))
self.menubar.setObjectName("menubar")
BinanceTracker.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(parent=BinanceTracker)
self.statusbar.setObjectName("statusbar")
BinanceTracker.setStatusBar(self.statusbar)
self.retranslateUi(BinanceTracker)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(BinanceTracker)
# Load data into tableWidget_2
num_pairs_per_row = 6 # Change this to the desired number of pairs per row
load_data_to_table(self.tableWidget_2, 'price.json', num_pairs_per_row)
# Connect the pushButton to a function that will handle the formula
self.pushButton.clicked.connect(self.calculate_formula)
def calculate_formula(self):
# Получаем формулу из lineEdit
formula = self.lineEdit.text().strip()
# Разделяем формулу на части (например, ETHBTC*BNBBTC -> ['ETHBTC', 'BNBBTC'])
parts = formula.replace(' ', '').split('+') # Сначала разбиваем по '+'
# Инициализируем результат
result = 0.0
valid_formula = True
# Вычисляем результат
for part in parts:
sub_parts = part.split('-') # Разбиваем по '-'
sub_result = 0.0
for sub_part in sub_parts:
if '*' in sub_part or '/' in sub_part: # Если есть умножение или деление
# Разбиваем по '*' и '/'
factors = []
for factor in sub_part.replace('-', ' -').replace('+', ' +').split():
if factor: # Проверяем, что не пустая строка
factors.append(factor)
# Вычисляем результат для текущей подчасти
try:
sub_result = eval('*'.join(factors)) # Используем eval для вычисления
except Exception as e:
valid_formula = False
break
else:
# Если это просто монета, ищем ее цену
found = False
for row_index in range(self.tableWidget_2.rowCount()):
for col_index in range(0, self.tableWidget_2.columnCount(), 2):
if self.tableWidget_2.item(row_index, col_index) and self.tableWidget_2.item(row_index,
col_index).text() == sub_part:
price_item = self.tableWidget_2.item(row_index, col_index + 1)
if price_item:
sub_result += float(price_item.text())
found = True
break
if not found:
valid_formula = False
break
result += sub_result
# Если формула корректна, добавляем результат в tableWidget
if valid_formula:
current_row_count = self.tableWidget.rowCount()
self.tableWidget.setRowCount(current_row_count + 1) # Увеличиваем количество строк
# Заполняем строку формулой и результатом
self.tableWidget.setItem(current_row_count, 0, QTableWidgetItem(formula)) # Добавляем формулу
self.tableWidget.setItem(current_row_count, 1, QTableWidgetItem(str(result))) # Добавляем результат
else:
# Показываем сообщение об ошибке, если формула некорректна
QMessageBox.warning(self.centralwidget, "Ошибка", "Некорректная формула или монета не найдена.")
def retranslateUi(self, BinanceTracker):
_translate = QtCore.QCoreApplication.translate
BinanceTracker.setWindowTitle(_translate("BinanceTracker", "BinanceTracker V1"))
self.groupBox.setTitle(_translate("BinanceTracker", "Операции"))
self.pushButton.setText(_translate("BinanceTracker", "Добавить операцию"))
self.lineEdit.setPlaceholderText(_translate("BinanceTracker", "Добавьте отслеживаемую функцию, например: ETHBTC*BNBBTC"))
self.pushButton_3.setText(_translate("BinanceTracker", "Удалить операцию"))
self.groupBox_2.setTitle(_translate("BinanceTracker", "Настройки трекера"))
self.lineEdit_2.setPlaceholderText(_translate("BinanceTracker", "Минимальное значение:"))
self.lineEdit_3.setPlaceholderText(_translate("BinanceTracker", "Максимальное значение:"))
self.pushButton_2.setText(_translate("BinanceTracker", "Сохранить значения"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("BinanceTracker", "Отслеживаемые монеты"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("BinanceTracker", "Полный список монет"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
BinanceTracker = QtWidgets.QMainWindow()
ui = Ui_BinanceTracker()
ui.setupUi(BinanceTracker)
BinanceTracker.show()
sys.exit(app.exec())
数据加载器.py:
import json
from PyQt6.QtWidgets import QTableWidgetItem
def load_data_to_table(table_widget, json_file_path, num_pairs_per_row):
with open(json_file_path, 'r') as file:
data = json.load(file)
num_columns = num_pairs_per_row * 2
table_widget.setColumnCount(num_columns)
# Set horizontal header labels
headers = []
for i in range(num_pairs_per_row):
headers.append(f"Монета {i + 1}")
headers.append(f"Цена {i + 1}")
table_widget.setHorizontalHeaderLabels(headers)
num_rows = -(-len(data) // num_pairs_per_row)
table_widget.setRowCount(num_rows)
for index, item in enumerate(data):
row_index = index // num_pairs_per_row
col_index = (index % num_pairs_per_row) * 2
table_widget.setItem(row_index, col_index, QTableWidgetItem(item['symbol'])) # Symbol
table_widget.setItem(row_index, col_index + 1, QTableWidgetItem(item['price'])) # Price
包含测试数据的文件: https://drive.google.com/file/d/15Jb82HgrRUalP-YyVQpx_x2TRO_fsbZA/view?usp =sharing
处理函数时的主要错误:
ETHBTC * BNBBTC,发生在以下行因为
factors包含没有值的变量的名称。你没有写出处理输入函数的逻辑和顺序是什么。
我尝试为您做一些事情来处理您输入的一些功能,但您仍有一些工作要做。
我对您的代码做了一些添加和更改并对其进行了注释。
永远不要更改 Qt Designer 生成的代码。
创建从相应小部件继承的另一个类,并使用创建的类来填充它。
main.py:
price.json: