| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636 |
- import sys
- from stringprep import in_table_c11
- from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QTabWidget, \
- QLabel, QLineEdit, QTextEdit, QFormLayout, QMessageBox, QTreeWidget, QTreeWidgetItem, QDialog, \
- QVBoxLayout as QDialogVBoxLayout, QLineEdit as QDialogLineEdit, QDialogButtonBox, QCheckBox, QComboBox
- from PyQt6.QtCore import Qt
- import requests as req
- import time, random, numpy as np
- import threading
- import asyncio
- import json
- from PyQt6.QtWidgets import QFileDialog
- from PyQt6.QtCore import pyqtSignal, QObject, pyqtSlot
- import sqlite3
- import time
- from datetime import datetime
- class MainWindow(QMainWindow):
- def __init__(self):
- super().__init__()
- # todo 为了测试 page_size = 1
- self.getToBuyUrl = 'https://buff.163.com/api/market/goods/sell_order?game=csgo&allow_epay=1&allow_tradable_cooldown=1&page_num=1&page_size=1&sort_by=price.asc&goods_id='
- self.buyGoodsUrl = 'https://buff.163.com/api/market/goods/buy'
- # self.getToBuyUrl = 'https://buff.163.com/api/market/goods/sell_order?game=csgo&allow_epay=1&allow_tradable_cooldown=1&page_num=1&page_size=95&sort_by=price.asc&goods_id='
- self.fbjUrl= 'https://buff.163.com/api/market/bill_order/ask_seller_to_send_offer'
- self.my_headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
- "Host": "buff.163.com",
- "Referer": "https://buff.163.com/market/?game=csgo",
- "X-Requested-With": "XMLHttpRequest"
- }
- # 设置窗口大小
- self.resize(1500, 800)
- # 创建主布局
- main_layout = QVBoxLayout()
- # 创建按钮
- self.scan_button = QPushButton("扫货")
- self.scan_button.clicked.connect(self.scan_items)
- self.stop_scan_button = QPushButton("停止扫货")
- self.stop_scan_button.clicked.connect(self.stop_scan_items)
- # 设置按钮大小
- self.scan_button.setFixedSize(100, 100)
- self.stop_scan_button.setFixedSize(100, 100)
- # 将按钮添加到布局中
- button_layout = QHBoxLayout()
- button_layout.addWidget(self.scan_button)
- button_layout.addWidget(self.stop_scan_button)
- main_layout.addLayout(button_layout)
- # 创建标签页
- self.tab_widget = QTabWidget()
- self.tab1 = QWidget()
- self.tab2 = QWidget()
- self.tab3 = QWidget()
- self.tab4 = QWidget()
- # 修改第一个标签页的标题和内容
- self.tab_widget.addTab(self.tab1, "BUFF选品日志")
- self.setup_tab1()
- # 修改第二个标签页的标题和内容
- self.tab_widget.addTab(self.tab2, "扫货账号信息")
- self.setup_tab2()
- self.tab_widget.addTab(self.tab3, "扫货配置信息")
- self.setup_tab3()
- self.tab_widget.addTab(self.tab4, "Tab 4")
- # 将标签页添加到主布局中
- main_layout.addWidget(self.tab_widget)
- # 设置主窗口的中心部件
- container = QWidget()
- container.setLayout(main_layout)
- self.setCentralWidget(container)
- def stop_scan_items(self):
- # 在这里添加停止扫货的逻辑
- # 设置扫货停止标志为True
- self.stop_selecting_flag = True
- QMessageBox.information(self, "停止扫货", "扫货操作已终止")
- def scan_items(self):
- self.stop_selecting_flag = False
- # 必填条件,没有则跳出
- self.phone_number = self.phone_edit.text()
- QMessageBox.information(self, "扫货手机号码", f"扫货手机号码: {self.phone_number}")
- # 判断phone_number是否为空,为空则跳出方法
- if not self.phone_number:
- QMessageBox.information(self, "扫货手机号码", "扫货手机号码不能为空")
- return
- # 判断扫货cookie是否为空,为空则退出方法
- self.cookie_text = self.cookie_edit.toPlainText()
- QMessageBox.information(self, "扫货Cookie", f"扫货Cookie: {self.cookie_text}")
- if not self.cookie_text:
- QMessageBox.information(self, "扫货Cookie", "扫货Cookie不能为空")
- return
- try:
- thread_BUFFSH = threading.Thread(target=self.BUFFSH)
- thread_BUFFSH.start()
- except Exception as e:
- print(f"Error: {e}")
- def BUFFSH(self):
- print(f'开始扫货')
- # 遍历树形多选框中的所有项
- for i1 in range(self.tree_widget.topLevelItemCount()):
- item = self.tree_widget.topLevelItem(i1)
- if self.stop_selecting_flag:
- print(f'人工停止扫货')
- break
- goods_id = item.text(1)
- goods_min_wear = item.text(3)
- goods_max_wear = item.text(4)
- goods_buy_price = item.text(6)
- # 请求BUFF 商品信息列表,获取可以购买的商品
- goods_items_list = self.getGoodsInfo(goods_id, goods_min_wear, goods_max_wear, goods_buy_price)
- for goods_item in goods_items_list:
- if self.stop_selecting_flag:
- print(f'人工停止扫货')
- break
- # post 请求 购买接口
- try:
- print(f"商品ID: {goods_item['goods_id']} 订单id: {goods_item['id']} 购买价格: {goods_item['price']}")
- # 获取当前时间戳
- start_time = time.time()
- api_data ={
- "game": "csgo",
- "goods_id": goods_item['goods_id'],
- "sell_order_id": goods_item['id'],
- "price": goods_item['price'],
- "pay_method": 1,
- "allow_tradable_cooldown": 0,
- "token": "",
- "cdkey_id": "",
- "hide_non_epay": False
- }
- api_header = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
- "Host": "buff.163.com", "X-Requested-With": "XMLHttpRequest",
- 'Referer': f"https://buff.163.com/goods/{goods_item['goods_id']}?from=market",
- 'Cookie': self.cookie_text,
- 'x-csrftoken': "ImM2NTBjYmZhNjk2MGRjOWVkMTQxYjM5MTBjY2RhZjJjODRkNTBlMjUi.Z7WAmQ.yZ6n3Hcjv6eXHEElO1ZA95aqSEA"}
- # todo
- print(f'api_header: {api_header}')
- res = req.post(self.buyGoodsUrl, headers=api_header, data=api_data)
- print(f'post 请求 {self.buyGoodsUrl} 返回报文: {res.text.strip()}')
- if res.json()['code'] == 'OK':
- print(f'购买成功,暂停{float(self.pause_time_edit.text())}秒发报价')
- time.sleep(float(self.pause_time_edit.text()))
- print(f'post 请求 {self.buyGoodsUrl} 返回报文code等于OK,商品id:{goods_id}的磨损区间{goods_min_wear}-{goods_max_wear}的商品信息:{goods_item}')
- try:
- bill_order_id = res.json()['data']['id']
- print(f'开始发报价 bill_order_id:{bill_order_id}')
- fbj_api_data=json.dumps({
- "bill_orders": [
- bill_order_id
- ],
- "game": "csgo"
- })
- print(f'fbj_api_data: { fbj_api_data }')
- fbj_api_header = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
- "Host": "buff.163.com", "X-Requested-With": "XMLHttpRequest",
- 'Referer': f"https://buff.163.com/market/buy_order/history?game=csgo",
- 'Cookie': self.cookie_text,
- "Content-Type":"application/json",
- 'x-csrftoken': "ImM2NTBjYmZhNjk2MGRjOWVkMTQxYjM5MTBjY2RhZjJjODRkNTBlMjUi.Z7WAmQ.yZ6n3Hcjv6eXHEElO1ZA95aqSEA"
- }
- # todo
- #fbj_res = req.post(self.fbjUrl, headers=fbj_api_header, data=fbj_api_data)
- #print(f'post 请求 发报价 返回报文: {fbj_res.text.strip()}')
- #if fbj_res.json()['code'] == 'OK':
- # print(f'报价成功')
- #else:
- # print(f'报价失败')
- except Exception as e:
- print(f'商品发报价信息接口请求--失败', e)
- except Exception as e:
- print(f'购买商品信息接口请求--失败', e)
- finally:
- # 结束时间为当前时间
- end_time = time.time()
- # 从start_time到end_time 必须修改pause_time秒
- if float(end_time - start_time) < float(self.pause_time_edit.text()):
- time.sleep(float(self.pause_time_edit.text()) - (end_time - start_time) + random.randint(0, 5))
- print(f'停止扫货')
- def getGoodsInfo(self, goods_id, goods_min_wear, goods_max_wear, goods_buy_price):
- # 获取当前时间戳
- timestamp = time.time()
- # 将时间戳转换为datetime对象
- dt_object = datetime.fromtimestamp(timestamp)
- print(f"{dt_object.strftime('%Y-%m-%d %H:%M:%S')}获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息")
- # 开始时间为当前时间
- goods_id_list = []
- start_time = time.time()
- self.my_headers.update({
- 'Cookie': self.cookie_text
- })
- try:
- # todo 为了测试,先去除磨损区间
- # api_url = f'{self.getToBuyUrl}{goods_id}&min_price=0&max_price={goods_buy_price}&min_paintwear={goods_min_wear}&max_paintwear={goods_max_wear}'
- api_url = f'{self.getToBuyUrl}{goods_id}&min_price=0&max_price={goods_buy_price}'
- # print(f'api_url = {api_url}')
- api2_res = req.get(api_url, headers=self.my_headers)
- # print(f'获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息的返回报文: {api2_res.text.strip()}')
- data = api2_res.json()['data']
- # 如果data中的code不等于OK,则跳出循环
- if api2_res.json()['code'] != 'OK':
- print(f'获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息请求返回报文: {api2_res.text.strip()}')
- print(f'获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息接口请求返回报文code不等于OK,跳出循环')
- return
- goods_id_list = data['items']
- print(f"获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息:", len(goods_id_list))
- except Exception as e:
- print(f'获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息接口请求--失败', e)
- finally:
- # 结束时间为当前时间
- end_time = time.time()
- # 从start_time到end_time 必须修改pause_time秒
- if float(end_time - start_time) < float(self.pause_time_edit.text()):
- time.sleep(float(self.pause_time_edit.text()) - (end_time - start_time) + random.randint(0, 5))
- return goods_id_list
- def setup_tab1(self):
- # 创建树形多选框
- self.tree_widget = QTreeWidget()
- self.tree_widget.setHeaderLabels(
- ["商品选择", "商品ID", "商品名称", "商品磨损最低值", "商品磨损最高值", "商品全磨损区间最低价", "商品扫货价",
- "商品判断价", "时间"])
- self.tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
- # 创建操作按钮
- self.add_button = QPushButton("新增")
- self.edit_button = QPushButton("修改")
- self.delete_button = QPushButton("删除")
- self.export_button = QPushButton("导出")
- self.import_button = QPushButton("导入")
- # 将按钮添加到布局中
- button_layout = QHBoxLayout()
- button_layout.addWidget(self.add_button)
- button_layout.addWidget(self.edit_button)
- button_layout.addWidget(self.delete_button)
- button_layout.addWidget(self.export_button)
- button_layout.addWidget(self.import_button)
- # 创建保存按钮
- self.save_button = QPushButton("保存")
- self.save_button.clicked.connect(self.save_items_to_db)
- button_layout.addWidget(self.save_button)
- # 创建主布局
- main_layout = QVBoxLayout()
- main_layout.addLayout(button_layout)
- main_layout.addWidget(self.tree_widget)
- # 设置标签页的布局
- self.tab1.setLayout(main_layout)
- # 连接按钮信号和槽
- self.add_button.clicked.connect(self.add_item)
- self.edit_button.clicked.connect(self.edit_item)
- self.delete_button.clicked.connect(self.delete_item)
- self.export_button.clicked.connect(self.export_items)
- self.import_button.clicked.connect(self.import_items)
- # 加载数据
- self.load_items_from_db()
- def load_items_from_db(self):
- import sqlite3
- # 连接到SQLite数据库
- conn = sqlite3.connect('SH1.db')
- c = conn.cursor()
- # 创建表(如果表不存在)
- self.create_items_table(c)
- # 查询数据
- c.execute("SELECT * FROM items_info")
- rows = c.fetchall()
- # 将数据添加到树形多选框
- for row in rows:
- item = QTreeWidgetItem()
- item.setText(0, "") # 商品选择
- item.setText(1, row[0]) # 商品ID
- item.setText(2, row[1]) # 商品名称
- item.setText(3, row[2]) # 商品磨损最低值
- item.setText(4, row[3]) # 商品磨损最高值
- item.setText(5, row[4]) # 商品全磨损区间最低价
- item.setText(6, row[5]) # 商品扫货价
- item.setText(7, row[6]) # 商品判断价
- item.setText(8, row[7]) # 时间
- self.tree_widget.addTopLevelItem(item)
- # 关闭数据库连接
- conn.close()
- def setup_tab2(self):
- # 创建表单布局
- form_layout = QFormLayout()
- # 从数据库中获取默认值
- conn = sqlite3.connect('SH1.db')
- c = conn.cursor()
- c.execute('''CREATE TABLE IF NOT EXISTS account_info
- (phone TEXT, email TEXT, code TEXT, cookie TEXT)''')
- c.execute("SELECT phone, email, code, cookie FROM account_info LIMIT 1")
- default_values = c.fetchone()
- conn.close()
- # 设置默认值
- phone_default = default_values[0] if default_values else "17756576757"
- email_default = default_values[1] if default_values else "704541015@qq.com"
- code_default = default_values[2] if default_values else "0012312"
- cookie_default = default_values[3] if default_values else ""
- # 添加输入字段
- self.phone_edit = QLineEdit(phone_default)
- self.email_edit = QLineEdit(email_default)
- self.code_edit = QLineEdit(code_default)
- self.cookie_edit = QTextEdit(cookie_default)
- # 设置输入字段的宽度
- self.phone_edit.setFixedWidth(500)
- self.email_edit.setFixedWidth(500)
- self.code_edit.setFixedWidth(500)
- self.cookie_edit.setFixedWidth(500)
- form_layout.addRow("扫货手机号码", self.phone_edit)
- form_layout.addRow("扫货邮箱号", self.email_edit)
- form_layout.addRow("扫货邮箱特殊代码", self.code_edit)
- form_layout.addRow("扫货cookie", self.cookie_edit)
- # 创建主布局
- main_layout = QVBoxLayout()
- main_layout.addLayout(form_layout)
- # 设置标签页的布局
- self.tab2.setLayout(main_layout)
- # 连接保存按钮信号和槽
- self.save_button = QPushButton("保存")
- self.save_button.clicked.connect(self.save_account_info)
- self.save_button.setFixedSize(100, 50)
- # 创建一个水平布局来放置保存按钮
- button_layout = QHBoxLayout()
- button_layout.setContentsMargins(300, 0, 0, 0)
- button_layout.addWidget(self.save_button, alignment=Qt.AlignmentFlag.AlignLeft)
- # 将垂直布局添加到表单布局中
- form_layout.addRow(button_layout)
- form_layout.setContentsMargins(300, 0, 0, 0)
- def save_account_info(self):
- import sqlite3
- # 连接到SQLite数据库(如果数据库不存在,则会自动创建)
- conn = sqlite3.connect('SH1.db')
- c = conn.cursor()
- # 创建表
- c.execute('''CREATE TABLE IF NOT EXISTS account_info
- (phone TEXT, email TEXT, code TEXT, cookie TEXT)''')
- c.execute('DELETE FROM account_info')
- # 插入数据
- c.execute("INSERT INTO account_info (phone, email, code, cookie) VALUES (?, ?, ?, ?)",
- (self.phone_edit.text(), self.email_edit.text(), self.code_edit.text(),
- self.cookie_edit.toPlainText()))
- # 提交更改并关闭连接
- conn.commit()
- conn.close()
- QMessageBox.information(self, "成功", "账号信息已保存")
- def setup_tab3(self):
- # 创建表单布局
- form_layout = QFormLayout()
- # 添加输入字段
- self.pause_time_edit = QLineEdit()
- self.pause_time_edit.setFixedWidth(500)
- form_layout.addRow("API接口请求暂停时间(秒)", self.pause_time_edit)
- # 创建主布局
- main_layout = QVBoxLayout()
- main_layout.addLayout(form_layout)
- # 创建保存按钮
- self.save_button = QPushButton("保存")
- self.save_button.clicked.connect(self.save_settings)
- self.save_button.setFixedSize(100, 50)
- # 创建一个水平布局来放置保存按钮
- button_layout = QHBoxLayout()
- button_layout.setContentsMargins(300, 0, 0, 0)
- button_layout.addWidget(self.save_button, alignment=Qt.AlignmentFlag.AlignLeft)
- # 将垂直布局添加到表单布局中
- form_layout.addRow(button_layout)
- form_layout.setContentsMargins(300, 0, 0, 0)
- # 添加pause_time_edit到主布局
- main_layout.addWidget(self.pause_time_edit)
- # 设置标签页的布局
- self.tab3.setLayout(main_layout)
- # 加载默认值
- self.load_pause_time_from_db()
- def load_pause_time_from_db(self):
- import sqlite3
- # 连接到SQLite数据库
- conn = sqlite3.connect('SH1.db')
- c = conn.cursor()
- # 创建表(如果表不存在)
- c.execute('''CREATE TABLE IF NOT EXISTS settings
- (pause_time REAL)''')
- # 查询数据
- c.execute("SELECT pause_time FROM settings LIMIT 1")
- default_value = c.fetchone()
- # 设置默认值
- pause_time_default = default_value[0] if default_value else "5"
- # 设置输入字段的默认值
- self.pause_time_edit.setText(str(pause_time_default))
- # 关闭数据库连接
- conn.close()
- def save_settings(self):
- import sqlite3
- # 连接到SQLite数据库(如果数据库不存在,则会自动创建)
- conn = sqlite3.connect('SH1.db')
- c = conn.cursor()
- # 创建表
- c.execute('''CREATE TABLE IF NOT EXISTS settings
- (pause_time REAL)''')
- c.execute('DELETE FROM settings')
- # 插入数据
- c.execute("INSERT INTO settings (pause_time) VALUES (?)",
- (float(self.pause_time_edit.text()),))
- # 提交更改并关闭连接
- conn.commit()
- conn.close()
- QMessageBox.information(self, "成功", "设置已保存")
- def save_items_to_db(self):
- import sqlite3
- # 连接到SQLite数据库(如果数据库不存在,则会自动创建)
- conn = sqlite3.connect('SH1.db')
- c = conn.cursor()
- # 创建表
- self.create_items_table(c)
- c.execute('DELETE FROM items_info')
- # 插入数据
- for i in range(self.tree_widget.topLevelItemCount()):
- item = self.tree_widget.topLevelItem(i)
- c.execute(
- "INSERT INTO items_info (item_id, item_name, min_paintwear, max_paintwear, min_price, buy_price, judge_price, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
- (item.text(1), item.text(2), item.text(3), item.text(4), item.text(5), item.text(6), item.text(7),
- item.text(8)))
- # 提交更改并关闭连接
- conn.commit()
- conn.close()
- QMessageBox.information(self, "成功", "商品信息已保存")
- def create_items_table(self, cursor):
- cursor.execute('''CREATE TABLE IF NOT EXISTS items_info
- (item_id TEXT, item_name TEXT, min_paintwear TEXT, max_paintwear TEXT, min_price TEXT, buy_price TEXT, judge_price TEXT, timestamp TEXT)''')
- def add_item(self):
- # 创建一个对话框来添加新项目
- dialog = QDialog(self)
- dialog.setWindowTitle("新增商品")
- layout = QDialogVBoxLayout()
- # 添加输入字段
- fields = ["商品ID", "商品名称", "商品磨损最低值", "商品磨损最高值", "商品全磨损区间最低价", "商品扫货价",
- "商品判断价", "时间"]
- line_edits = {}
- for field in fields:
- label = QLabel(field)
- line_edit = QDialogLineEdit()
- layout.addWidget(label)
- layout.addWidget(line_edit)
- line_edits[field] = line_edit
- # 添加按钮框
- button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
- button_box.accepted.connect(dialog.accept)
- button_box.rejected.connect(dialog.reject)
- layout.addWidget(button_box)
- dialog.setLayout(layout)
- if dialog.exec() == QDialog.DialogCode.Accepted:
- item = QTreeWidgetItem()
- for field in fields:
- # 调整索引值,将商品ID填入到“商品选择”的内容框体中
- item.setText(fields.index(field) + 1, line_edits[field].text())
- self.tree_widget.addTopLevelItem(item)
- def edit_item(self):
- # 获取选中的项
- selected_items = self.tree_widget.selectedItems()
- if not selected_items:
- QMessageBox.warning(self, "警告", "请选择要编辑的项目")
- return
- item = selected_items[0]
- dialog = QDialog(self)
- dialog.setWindowTitle("编辑商品")
- layout = QDialogVBoxLayout()
- # 添加输入字段
- fields = ["商品ID", "商品名称", "商品磨损最低值", "商品磨损最高值", "商品全磨损区间最低价", "商品扫货价",
- "商品判断价", "时间"]
- line_edits = {}
- for field in fields:
- label = QLabel(field)
- line_edit = QDialogLineEdit(item.text(fields.index(field) + 1))
- layout.addWidget(label)
- layout.addWidget(line_edit)
- line_edits[field] = line_edit
- # 添加按钮框
- button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
- button_box.accepted.connect(dialog.accept)
- button_box.rejected.connect(dialog.reject)
- layout.addWidget(button_box)
- dialog.setLayout(layout)
- if dialog.exec() == QDialog.DialogCode.Accepted:
- for field in fields:
- item.setText(fields.index(field) + 1, line_edits[field].text())
- def delete_item(self):
- # 获取选中的项
- selected_items = self.tree_widget.selectedItems()
- if not selected_items:
- QMessageBox.warning(self, "警告", "请选择要删除的项目")
- return
- for item in selected_items:
- # 删除顶级项
- (self.tree_widget.indexOfTopLevelItem(item))
- self.tree_widget.takeTopLevelItem(self.tree_widget.indexOfTopLevelItem(item))
- def export_items(self):
- # 导出元素的逻辑
- file_path, _ = QFileDialog.getSaveFileName(self, "导出商品数据", "", "JSON Files (*.json);;All Files (*)")
- if file_path:
- items = {}
- for i in range(self.tree_widget.topLevelItemCount()):
- item = self.tree_widget.topLevelItem(i)
- items[item.text(1)] = {
- "price": item.text(6),
- "min_paintwear": item.text(3),
- "max_paintwear": item.text(4),
- "name": item.text(2),
- '商品ID': item.text(1),
- '商品名称': item.text(2),
- '磨损最低值': item.text(3),
- '磨损最高值': item.text(4),
- '全磨损区间最低价': item.text(5),
- '扫货价': item.text(6),
- '判断价': item.text(7),
- '时间': item.text(8)
- }
- with open(file_path, 'w', encoding='utf-8') as f:
- json.dump(items, f, ensure_ascii=False, indent=4)
- QMessageBox.information(self, "成功", "数据已成功导出到 {}".format(file_path))
- def import_items(self):
- # 导入元素的逻辑
- file_path, _ = QFileDialog.getOpenFileName(self, "导入商品数据", "", "JSON Files (*.json);;All Files (*)")
- if file_path:
- with open(file_path, 'r', encoding='utf-8') as f:
- items = json.load(f)
- for item_id, item_data in items.items():
- item = QTreeWidgetItem()
- item.setText(0, "") # 商品选择
- item.setText(1, item_data['商品ID'])
- item.setText(2, item_data['商品名称'])
- item.setText(3, item_data['磨损最低值'])
- item.setText(4, item_data['磨损最高值'])
- item.setText(5, item_data['全磨损区间最低价'])
- item.setText(6, item_data['扫货价'])
- item.setText(7, item_data['判断价'])
- item.setText(8, item_data['时间'])
- self.tree_widget.addTopLevelItem(item)
- QMessageBox.information(self, "成功", "数据已成功导入")
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- window = MainWindow()
- window.show()
- sys.exit(app.exec())
|