17 Star 103 Fork 39

DNF计算器/Lv100

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
main.py 35.12 KB
一键复制 编辑 原始数据 按行查看 历史
西瓜 提交于 2022-02-15 06:23 . chore:封版
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881
import PyQt5.QtCore as qtc
import multiprocessing
from PyQt5.QtCore import QUrl, QThread
from PyQt5.QtWidgets import QApplication
from PyQt5 import QtCore
import importlib
from PublicReference.common import *
from PublicReference.utils.usage_counter import increase_counter
from PublicReference.view.MainWindow import *
from PublicReference.utils.calc_core import calc_core
from PublicReference.utils.producer_consumer import producer_data, consumer, thread_num
import traceback
from PublicReference.utils import zipfile, uniqueCode, img
from PublicReference.utils import img
from PublicReference.utils.LZextends import *
from PublicReference.view import NotificationButton
import sys
import time
import subprocess
import base64
import requests
import random
import datetime
# 配置PyQt5环境变量
import PyQt5
dirname = os.path.dirname(PyQt5.__file__)
plugin_path = os.path.join(dirname, 'Qt5', 'plugins')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
主进程PID = ''
偏移量 = 25
目录 = ''
if __name__ == '__main__':
multiprocessing.freeze_support()
class Worker(QThread):
sinOut = pyqtSignal(int)
def __init__(self, parent=None, fileURL=''):
super(Worker, self).__init__(parent)
self.working = True
self.fileURL = fileURL
def __del__(self):
# 线程状态改变与线程终止
self.working = False
self.wait()
def run(self):
path = os.getcwd() + "/__ZFJtemp"
try:
# os.rename(sys.argv[0],sys.argv[0]+'.del')
lzy = LZextends().lzy
lzy.down_file_by_url(self.fileURL,
'',
path,
callback=self.show_progress,
downloaded_handler=self.after_downloaded)
except Exception as error:
self.sinOut.emit(100)
def show_progress(self, file_name, total_size, now_size):
self.sinOut.emit(int(now_size / total_size * 100))
def after_downloaded(self, file_path):
try:
if ("main.py" not in sys.argv[0]) and ("exe" in sys.argv[0]):
os.rename(sys.argv[0], sys.argv[0] + '.del')
# sys.argv[0] = sys.argv[0] + '.del'
except Exception as error:
logger.error("error={} \n detail {}".format(
error, traceback.print_exc()))
pass
path = os.getcwd()
zip_file = zipfile.ZipFile(file_path)
zip_list = zip_file.namelist() # 得到压缩包里所有文件
for f in zip_list:
# if not f.endswith('desktop.ini'):
zip_file.extract(f, path)
# extracted_path.rename(newName)
# 循环解压文件到指定目录
zip_file.close()
# print(path+'\download')
try:
os.system('RMDIR /Q /S "{}"'.format(
os.path.join(os.getcwd(), '__ZFJtemp')))
except Exception as error:
logger.error("error={} \n detail {}".format(
error, traceback.print_exc()))
pass
self.working = False
class 选择窗口(QWidget):
计算器版本 = ''
云端版本 = ''
# 自动检查版本 = False
网盘链接 = ''
网盘报错 = 0
通知时间 = ''
_signal = QtCore.pyqtSignal(int)
def __init__(self):
super().__init__()
# self.thread_init()
self.ui()
self.char_window = None
def thread_init(self):
try:
# 工作队列
work_queue = multiprocessing.JoinableQueue()
work_queue.cancel_join_thread(
) # or else thread that puts data will not term
producer_data.work_queue = work_queue
# 工作进程
workers = []
for i in range(thread_num):
p = multiprocessing.Process(target=consumer,
args=(work_queue, calc_core),
daemon=True,
name="worker#{}".format(i + 1))
p.start()
workers.append(p)
# logger.info("已启动{}个工作进程".format(thread_num))
self.worker = workers
pass
except Exception as error:
return error
def 网盘检查(self):
return
if 目录.endswith('py'):
return
try:
lzy = LZextends().lzy
fileURL = ''
folder_info = lzy.get_folder_info_by_url(
'https://wwx.lanzoux.com/b01bfj76f')
if folder_info.code != LanZouCloud.SUCCESS:
self.网盘链接 = ''
self.网盘报错 = 1
return
# resp = urllib.request.urlopen('http://dnf.17173.com/jsq/instructions.html?j')
for file in folder_info.files:
if file.name.startswith("DNF计算器"):
self.云端版本 = file.name.replace(".zip", " 17173DNF.exe")
fileURL = file.url
if file.name.replace("DNF计算器",
"").replace(".zip", "").replace(
"-", ".") == self.计算器版本[5:]:
self.网盘链接 = ''
return
self.网盘链接 = fileURL
except Exception as error:
self.网盘链接 = ''
self.网盘报错 = 1
return
def ui(self):
角色列表 = []
self.setStyleSheet('''QToolTip {
background-color: black;
color: white;
border: 0px
}''')
self.setMinimumSize(805, 625)
self.setMaximumSize(805, 1520)
if not os.path.exists('./ResourceFiles'):
QMessageBox.information(self, "解压错误",
"未找到资源文件,请将压缩包中ResourceFiles解压到同目录后打开计算器")
return
with open("ResourceFiles/Config/adventure_info.json",
encoding='utf-8') as fp:
角色列表 = json.load(fp)
fp.close()
self.计算器版本 = currentVersion
# self.自动检查版本 = versionInfo['AutoCheckUpdate']
fp.close()
self.setWindowTitle(trans('DNF搭配计算器&17173DNF专区'))
self.icon = QIcon('ResourceFiles/img/logo.ico')
self.setWindowIcon(self.icon)
bgcolor = QLabel(self)
bgcolor.resize(805, 1520)
# bgcolor.setStyleSheet("QLabel{background-color:rgba(0,0,0,1)}")
bgcolor.setStyleSheet("QLabel{background:url('" +
trans('ResourceFiles/img/分类') + "/bg.png')}")
self.char_img = []
self.family_img = []
is_gif = os.path.exists('动态头像')
for i in range(1, 76):
if is_gif:
self.char_img.append(QMovie("动态头像/" + str(i) + ".gif"))
else:
if i == 30 and not 多语言开关 == 0:
self.char_img.append(
QPixmap(
trans("ResourceFiles/img/头像/") + str(i) + ".png"))
else:
self.char_img.append(
QPixmap("ResourceFiles/img/头像/" + str(i) + ".png"))
for i in range(17):
self.family_img.append(
QPixmap("" + trans('ResourceFiles/img/分类') + "/" + str(i) +
".png"))
#wrapper = QWidget()
# self.setCentralWidget(wrapper)
self.topFiller = QWidget()
self.topFiller.setMinimumSize(750, 1520)
count = 0
reason = ''
canUse = -1
try:
code = get_mac_address()
repJson = requests.get(
"https://i_melon.gitee.io/dnfcalculating/ban.json",
timeout=2).json()
if not code == '':
if code in [
'2190155ee92d17e8cc3b0c9892fd5ac7',
'1ba5ea8fa16964666f0c0a85e89c3e96',
'2e3d28298db82f8b23dc9fa6aac14b6d',
'f8b3cf5c269c97a8d6d2d97ecf769a06'
]:
canUse = random.randint(0, 75)
reason = '呵呵'
reason = repJson[code]['reason']
if reason != '': canUse = random.randint(0, 75)
# except:
# reason = '获取异常列表错误'
# canUse = random.randint(0, 75)
# pass
# try:
except:
pass
for i in range(75):
img_box = QLabel(self.topFiller)
if is_gif:
img_box.setMovie(self.char_img[i])
self.char_img[i].start()
else:
img_box.setPixmap(self.char_img[i])
img_box.resize(121, 90)
img_box.move(100 + 偏移量 + (count % 5) * 125,
10 + int(count / 5) * 100)
if i < 75:
if 角色列表[i]["类名"] != '空':
img_box_2 = QLabel(self.topFiller)
img_box_2.setPixmap(self.family_img[16])
img_box_2.resize(121, 90)
img_box_2.move(100 + 偏移量 + (count % 5) * 125,
10 + int(count / 5) * 100)
txt_box = QLabel(self.topFiller)
txt_box.setStyleSheet(
'QLabel{font-size:13px;color:rgb(175,148,89)}')
txt_box.setText(trans(角色列表[i]["显示名称"]))
txt_box.resize(121, 24)
txt_box.setAlignment(Qt.AlignCenter)
txt_box.move(100 + 偏移量 + (count % 5) * 125,
76 + int(count / 5) * 100)
butten = QPushButton(self.topFiller)
butten.setStyleSheet(按钮样式2)
butten.resize(121, 90)
butten.move(100 + 偏移量 + (count % 5) * 125,
10 + int(count / 5) * 100)
if canUse > 0 and i != canUse:
butten.clicked.connect(
lambda state, reason=reason: self.弹窗警告(reason))
else:
butten.clicked.connect(
lambda state, index=角色列表[i]: self.职业版本判断(index))
# temp = '<b>作者:<font color="#C66211">' + 角色列表[i][
# "作者"] + '</font>'
# butten.setToolTip(temp)
else:
img_box_2 = QLabel(self.topFiller)
img_box_2.setStyleSheet(
"QLabel{background-color:rgba(0,0,0,0.8)}")
img_box_2.resize(121, 90)
img_box_2.move(100 + 偏移量 + (count % 5) * 125,
10 + int(count / 5) * 100)
count += 1
count = 0
for i in range(15):
sign = 1
for j in range(i * 5 + 1, i * 5 + 6):
if j > 75:
sign = 0
break
if sign == 1:
img_box_2 = QLabel(self.topFiller)
img_box_2.setPixmap(self.family_img[15])
img_box_2.resize(94, 90)
img_box_2.setAlignment(Qt.AlignCenter)
img_box_2.move(偏移量, 10 + count * 100)
img_box = QLabel(self.topFiller)
img_box.setPixmap(self.family_img[i])
img_box.resize(94, 90)
img_box.setAlignment(Qt.AlignCenter)
img_box.move(偏移量, 10 + count * 100)
count += 1
# 为了女鬼调整位置
count = 1
butten = QtWidgets.QPushButton(
' ' + trans('首页') + '\n ' + trans('设置|打赏|反馈'), self.topFiller)
# butten = QtWidgets.QPushButton(" " + trans(''), self.topFiller)
menu = QMenu()
action_0 = QAction(trans('设置'), parent=menu)
action_0.triggered.connect(lambda state: self.openSet())
action_1 = QAction(trans('BUG反馈-Gitee'), parent=menu)
action_1.triggered.connect(lambda state: self.打开链接([
'https://gitee.com/i_melon/DNFCalculating/issues?state=all'
], "Gitee"))
action_2 = QAction('联系我们-QQ-1群', parent=menu)
action_2.triggered.connect(lambda state: self.打开链接(
['https://jq.qq.com/?_wv=1027&k=VSNtZ1xv'], "QQ群"))
action_3 = QAction('联系我们-QQ-2群', parent=menu)
action_3.triggered.connect(lambda state: self.打开链接(
['https://jq.qq.com/?_wv=1027&k=QMgadVkA'], "QQ群"))
action_4 = QAction('联系我们-QQ-3群', parent=menu)
action_4.triggered.connect(lambda state: self.打开链接(
['https://jq.qq.com/?_wv=1027&k=ekQXpyq0'], "QQ群"))
action_5 = QAction(trans('打赏'), parent=menu)
action_5.triggered.connect(lambda state, index=count: self.打赏())
action_6 = QAction('联系我们-解除限制', parent=menu)
action_6.triggered.connect(lambda state: self.打开链接([
'https://gitee.com/i_melon/DNFCalculating/issues/I4IOO7'
], "解除限制"))
action_7 = QAction(QIcon('ResourceFiles/img/logo.ico'),
trans('手册 源码 日志'),
parent=menu)
action_7.triggered.connect(
lambda state: self.打开链接(['http://dnf.17173.com/jsq/?khd'], "首页"))
menu.addAction(action_7)
menu.addSeparator()
menu.addAction(action_0)
menu.addSeparator()
menu.addAction(action_5)
menu.addSeparator()
menu.addAction(action_1)
menu.addSeparator()
menu.addAction(action_2)
menu.addAction(action_3)
menu.addAction(action_4)
menu.addAction(action_6)
butten.setMenu(menu)
# butten.clicked.connect(lambda state, index = count: self.问题反馈())
# menu=QMenu()
# action_0 = QAction('手册',parent=menu)
# action_1 = QAction('日志',parent=menu)
# action_2 = QAction('源码',parent=menu)
# menu.addAction(action_0)
# menu.addAction(action_1)
# menu.addAction(action_2)
# butten.setMenu(menu)
butten.move(100 + 偏移量 + 4 * 125, 10 + (count + 1) * 100)
butten.setStyleSheet(按钮样式3)
butten.resize(121, 90)
count += 1
butten = QtWidgets.QPushButton(trans('检查更新'), self.topFiller)
butten.clicked.connect(lambda state, index=count: self.检查更新())
butten.move(100 + 偏移量 + 4 * 125, 10 + (count + 1) * 100)
butten.setStyleSheet(按钮样式3)
butten.resize(121, 90)
self.配置错误 = QMessageBox(
QMessageBox.Question, "提示",
"配置文件有误,程序将以默认设置开启!\n请检查以下文件\nResourceFiles\\Config\\基础设置.ini\nResourceFiles\\Config\\攻击目标.ini\nResourceFiles\\Skins\\Skin.ini\n是否以UTF-8编码存储且文件内格式正确"
)
self.版本提示 = QMessageBox(
QMessageBox.Question, "用户须知",
trans("此工具为开源免费软件\n如遇二次售卖获利,请协助反馈举报~") +
'\n同时,计算器预设了埋点,收集使用情况供功能分析优化并限制滥用工具的情况,如:职业打开情况、页签打开情况、按钮使用情况等')
self.版本提示.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
self.版本提示A = self.版本提示.button(QMessageBox.Yes)
self.版本提示B = self.版本提示.button(QMessageBox.No)
self.版本提示A.setText('已知悉')
self.版本提示B.setText('退出')
try:
if 自动检查更新 == 0:
repJson = requests.get(
"https://i_melon.gitee.io/dnfcalculating/notice.json",
timeout=2).json()
self.通知时间 = repJson[0]['time']
self.消息通知 = QMessageBox(QMessageBox.Question, "通知",
repJson[0]['info'])
self.消息通知.setWindowIcon(self.icon)
confirm = NotificationButton.ConfirmButton(self.消息通知)
self.消息通知.setWindowFlags(Qt.Window | Qt.WindowTitleHint
| Qt.CustomizeWindowHint)
self.消息通知.addButton(confirm, QMessageBox.YesRole)
except Exception as error:
pass
self.版本提示.setWindowIcon(self.icon)
self.配置错误.setWindowIcon(self.icon)
if 自动检查更新 == 0:
try:
self.网盘检查()
if self.网盘报错 == 1:
self.报错提示 = QMessageBox(QMessageBox.Question, "提示",
trans("无法自动检查更新,请在每周三/四自行前往检查版本"))
self.报错提示.setWindowIcon(self.icon)
# box.exec_()
if self.网盘链接 != '':
m_red_SheetStyle = "padding-left:3px;min-width: 25px; min-height: 16px;border-radius: 5px; background:red;color:white"
label = QLabel("New", self.topFiller)
label.move(115 + 4 * 125 + 90, 30 + (count + 1) * 100)
label.setStyleSheet(m_red_SheetStyle)
except Exception as error:
pass
count += 1
count += 1
# butten = QtWidgets.QPushButton('打 赏', self.topFiller)
# butten.clicked.connect(lambda state, index=count: self.打赏())
# butten.move(100 + 偏移量 + 4 * 125, 10 + (count + 1) * 100)
# butten.setStyleSheet(按钮样式3)
# butten.resize(121, 90)
# count += 1
butten = QtWidgets.QPushButton('', self.topFiller)
butten.clicked.connect(lambda state, index=count: self.打开链接(
['http://dnf.17173.com/?jsq'], "首页"))
butten.move(100 + 偏移量 + 4 * 125, 10 + (count + 1) * 100)
butten.setStyleSheet(按钮样式3)
butten.resize(121, 90)
count += 1
self.scroll = QScrollArea()
self.scroll.setFrameShape(QFrame.NoFrame)
self.scroll.setStyleSheet("QScrollArea {background-color:transparent}")
self.scroll.setStyleSheet(游戏滚动条样式模拟)
self.scroll.viewport().setStyleSheet("background-color:transparent")
self.scroll.setWidget(self.topFiller)
self.vbox = QVBoxLayout()
self.vbox.addWidget(self.scroll)
self.setLayout(self.vbox)
def openSet(self):
increase_counter(ga_category="其余功能使用", name="设置")
self.processpid = []
self.setWindow = SetWindows(self.worker, self)
# self.setWindow._signal.connect(self.closeSet)
self.win = MainWindow(self.setWindow)
self.win.show()
def closeSet(self, parameter):
if parameter == 1:
win.close()
def 打开窗口(self, name):
if self.char_window != None:
self.char_window.close()
if "." in name:
className = name.split(".")[1]
else:
className = name
module_name = "Characters." + name
职业 = importlib.import_module(module_name)
char = eval("职业." + className + '()')
increase_counter(ga_category="职业使用", name=className)
if get_mac_address() != '':
increase_counter(ga_category="用户职业使用", name=get_mac_address())
try:
self.char_window = MainWindow(char)
self.char_window.show()
except Exception as e:
print(e)
def 打赏(self):
self.w = QWidget()
self.w.resize(300, 300)
self.w.setWindowTitle('打赏-微信')
self.w.setWindowIcon(self.icon)
主背景 = QLabel(self.w)
赞赏码 = QPixmap()
赞赏码.loadFromData(base64.b64decode(img.二维码))
主背景.setPixmap(赞赏码)
increase_counter(ga_category="其余功能使用", name="打赏")
self.w.show()
def 弹窗警告(self, reason):
box = QMessageBox(
QMessageBox.Question, "提示",
"{}由于{},您已被限制使用计算器,每次开启仅能随机使用一个职业<br>如需解除,请于设置=>解除限制内申请".format(
get_mac_address(), reason))
box.setWindowIcon(self.icon)
box.setStandardButtons(QMessageBox.Yes)
box.exec_()
def 职业版本判断(self, index):
try:
if index["类名2"] == '无':
self.打开窗口(index["类名"])
return
else:
box = QMessageBox(QMessageBox.Question, "提示", "请选择要打开的版本")
box.setWindowIcon(self.icon)
box.setStandardButtons(QMessageBox.Yes | QMessageBox.No
| QMessageBox.Cancel)
if index["序号"] in ["40", "41"]:
if index["类名3"] != '无':
box.setStandardButtons(QMessageBox.Yes | QMessageBox.No
| QMessageBox.YesToAll
| QMessageBox.Cancel)
A = box.button(QMessageBox.Yes)
B = box.button(QMessageBox.No)
A.setText('BUFF')
B.setText('战斗')
if index["类名3"] != '无':
C = box.button(QMessageBox.YesToAll)
C.setText('前瞻版本-战斗')
else:
A = box.button(QMessageBox.Yes)
B = box.button(QMessageBox.No)
A.setText('国服版本')
B.setText('前瞻版本')
E = box.button(QMessageBox.Cancel)
E.setText('取消')
box.exec_()
try:
if box.clickedButton() == A:
self.打开窗口(index["类名"])
elif box.clickedButton() == B:
self.打开窗口(index["类名2"])
elif box.clickedButton() == C:
self.打开窗口(index["类名3"])
# elif box.clickedButton() == D:
# self.打开窗口(index["类名4"])
else:
return
except Exception as error:
pass
except Exception as error:
logger.error("error={} \n detail {}".format(
error, traceback.print_exc()))
return
def 打开链接(self, url, name=''):
if name != '':
increase_counter(ga_category="其余功能使用", name=name)
for i in url:
QDesktopServices.openUrl(QUrl(i))
def 检查更新(self):
increase_counter(ga_category="其余功能使用", name="检查更新")
self.网盘检查()
if self.网盘报错 == 1:
box = QMessageBox(QMessageBox.Question, "提示", "无法自动检查更新,请手动前往官网下载")
box.setWindowIcon(self.icon)
box.exec_()
elif self.网盘链接 == '':
box = QMessageBox(QMessageBox.Question, "提示", "已经是最新版本计算器!")
box.setWindowIcon(self.icon)
box.exec_()
else:
box = QMessageBox(QMessageBox.Question, "提示", "检测到新的计算器版本,是否更新?")
box.setWindowIcon(self.icon)
box.setStandardButtons(QMessageBox.Yes | QMessageBox.No
| QMessageBox.Cancel)
A = box.button(QMessageBox.Yes)
B = box.button(QMessageBox.No)
C = box.button(QMessageBox.Cancel)
A.setText("首页查看更新")
B.setText("自动更新")
C.setText(trans("取消"))
box.exec_()
if box.clickedButton() == B:
self.update()
if box.clickedButton() == A:
QDesktopServices.openUrl(QUrl('http://dnf.17173.com/jsq/?khd'))
def processBar(self, process):
if process < 100:
self.pbar.setFormat("Downloading..." + str(process) + '%')
self.pbar.setValue(process)
else:
self.遮罩.hide()
self.pbar.hide()
path = os.getcwd()
box = QMessageBox(QMessageBox.Question, "提示",
"升级完毕,确定后打开最新版本,删除当前旧版本!")
box.setWindowIcon(self.icon)
box.setStandardButtons(QMessageBox.Yes)
A = box.button(QMessageBox.Yes)
A.setText(trans("确定"))
box.exec_()
if box.clickedButton() == A:
for p in self.worker:
if p.is_alive:
p.terminate()
p.join()
newpath = os.path.join(os.getcwd(), "DNF计算器 17173DNF.exe")
oldpath = sys.argv[0] + '.del'
p = subprocess.Popen(
[
newpath,
str(主进程PID),
str(oldpath)
# "--cwd", dirpath,
# "--exe_name", filename,
],
shell=True,
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP
| subprocess.DETACHED_PROCESS,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
p.wait()
self._signal.emit(1)
def update(self):
self.遮罩 = QLabel(self)
self.遮罩.setStyleSheet("QLabel{background-color:rgba(0,0,0,0.8)}")
self.遮罩.resize(805, 625)
self.遮罩.move(0, 0)
self.遮罩.show()
self.pbar = QProgressBar(self)
self.pbar.setGeometry(30, 40, 200, 25)
self.pbar.move(325, 300)
self.pbar.setStyleSheet('''
QProgressBar{
border: 2px solid grey;
border-radius:5px;
text-align:center;
}
QProgressBar::chunk {
background-color: #05B8CC;
width: 10px;
}
''')
self.pbar.setFormat("Downloading...")
self.pbar.show()
self.thread = Worker(fileURL=self.网盘链接)
self.thread.sinOut.connect(self.processBar)
self.thread.start()
class SetWindows(QWidget):
# _signal = QtCore.pyqtSignal(int)
def __init__(self, worker, parWin):
super().__init__()
self.worker = worker
self.parWin = parWin
self.ui()
self.read()
def closeEvent(self, event):
self.保存设置()
super().closeEvent(event)
def read(self):
if not os.path.exists("ResourceFiles/Config/set.json"):
return
with open("ResourceFiles/Config/set.json", encoding='utf-8') as fp:
set_info = json.load(fp)
fp.close()
for i in set_info.keys():
try:
self.ComboBoxList[int(i)].setCurrentIndex(set_info[i])
except:
pass
def ui(self):
self.setStyleSheet('''QToolTip {
background-color: black;
color: white;
border: 0px
}''')
self.height = 625
with open(trans("ResourceFiles/Config/config.json"),
encoding='utf-8') as fp:
self.height = len(json.load(fp)) * 50 + 20
fp.close()
self.setMinimumSize(805, 625)
self.setWindowTitle(trans('全局设置选项(需重启计算器生效)'))
self.icon = QIcon('ResourceFiles/img/logo.ico')
self.setWindowIcon(self.icon)
self.topFiller = QWidget()
self.topFiller.setMinimumSize(750, self.height)
bgcolor = QLabel(self)
bgcolor.resize(805, 625)
bgcolor.setStyleSheet("QLabel{background:url('" +
trans('ResourceFiles/img/分类') + "/bg.png')}")
with open(trans("ResourceFiles/Config/Config.json"),
encoding='utf-8') as fp:
set_info = json.load(fp)
fp.close()
self.ComboBoxList = {}
num = 0
for i in set_info:
txt_box = QLabel(self.topFiller)
txt_box.setText('{}. {}'.format(num + 1, i['说明']))
txt_box.resize(700, 20)
txt_box.move(50, 10 + 50 * num)
txt_box.setStyleSheet(
'QLabel{font-size:13px;color:rgb(175,148,89)}')
txt2_box = QLabel(self.topFiller)
txt2_box.setText(i['名称'])
txt2_box.resize(70, 20)
txt2_box.move(60, 30 + 50 * num + 5)
txt2_box.setStyleSheet(
'QLabel{font-size:13px;color:rgb(175,148,89)}')
self.ComboBoxList[num] = MyQComboBox(self.topFiller,
useWheel=False)
self.ComboBoxList[num].addItems(i['选项'])
self.ComboBoxList[num].resize(100, 20)
self.ComboBoxList[num].move(50 + 80, 30 + 50 * num + 5)
self.ComboBoxList[num].setCurrentIndex(i['default'])
num += 1
self.scroll = QScrollArea()
self.scroll.setFrameShape(QFrame.NoFrame)
self.scroll.setStyleSheet("QScrollArea {background-color:transparent}")
self.scroll.setStyleSheet(游戏滚动条样式模拟)
self.scroll.viewport().setStyleSheet("background-color:transparent")
self.scroll.setWidget(self.topFiller)
self.vbox = QVBoxLayout()
self.vbox.addWidget(self.scroll)
self.setLayout(self.vbox)
def 保存设置(self):
set_data = {}
for i in self.ComboBoxList.keys():
set_data[i] = self.ComboBoxList[i].currentIndex()
with open("ResourceFiles/Config/set.json", "w",
encoding='utf-8') as fp:
json.dump(set_data, fp)
fp.close()
box = QMessageBox(QMessageBox.Warning, "提示", "保存完毕,重启计算器才能生效,是否重启")
box.setWindowIcon(self.icon)
yes = box.addButton(self.tr(trans("确定")), QMessageBox.YesRole)
no = box.addButton(self.tr(trans("取消")), QMessageBox.NoRole)
box.exec_()
if box.clickedButton() == yes:
self.立即重启()
# def 返回原页(self):
# #用self.close()无法关闭,所以用发射信号的方法在父窗口关闭页面
# self.是否保存 = 0
# data_int = 1
# # 发送信号
# self._signal.emit(data_int)
def 立即重启(self):
for p in self.worker:
if p.is_alive:
p.terminate()
p.join()
# self.close()
self.parWin.close()
if 目录.endswith('py'):
python = sys.executable
os.execl(python, python, *sys.argv)
else:
os.startfile(目录)
# 用的是杀死进程的方法,有机会改改
os.system("taskkill /pid {} -f".format(主进程PID))
# self.close()
if __name__ == '__main__':
主进程PID = os.getpid()
目录 = sys.argv[0]
if len(sys.argv) > 1:
try:
# 杀老进程
os.system("taskkill /pid {} -f".format(sys.argv[1]))
time.sleep(2)
if ("main.py" not in sys.argv[2]) and ("del" in sys.argv[2]):
# 删除老版本
os.remove(sys.argv[2])
# shutil.rmtree('download')
except Exception as error:
logger.error("error={} \n detail {}".format(
error, traceback.print_exc()))
if 窗口显示模式 == 1:
if hasattr(qtc.Qt, 'AA_EnableHighDpiScaling'):
QtWidgets.QApplication.setAttribute(qtc.Qt.AA_EnableHighDpiScaling,
True)
if hasattr(qtc.Qt, 'AA_UseHighDpiPixmaps'):
QtWidgets.QApplication.setAttribute(qtc.Qt.AA_UseHighDpiPixmaps,
True)
app = QApplication([])
try:
instance = 选择窗口()
instance._signal.connect(instance.closeSet)
win = MainWindow(instance)
win.show()
except Exception as error:
logger.error("error={} \n detail {}".format(error,
traceback.print_exc()))
用户须知 = False
try:
instance.报错提示.exec()
except Exception as error:
pass
if "main.py" not in sys.argv[0]:
try:
with open("ResourceFiles/Config/release_version.json", "r+") as fp:
versionInfo = json.load(fp)
展示信息 = versionInfo['ShowChangeLog']
用户须知 = versionInfo['agreement']
versionInfo['ShowChangeLog'] = False
fp.seek(0)
json.dump(versionInfo, fp, ensure_ascii=False)
fp.truncate()
fp.close()
if not os.path.exists("ResourceFiles/Config/notice_version.json"):
with open("ResourceFiles/Config/notice_version.json",
"w",
encoding='utf-8') as fp:
json.dump({"time": ""}, fp)
pass
with open("ResourceFiles/Config/notice_version.json", "r+") as fp:
versionInfo = json.load(fp)
通知时间 = versionInfo['time']
versionInfo['time'] = instance.通知时间
fp.seek(0)
json.dump(versionInfo, fp, ensure_ascii=False)
fp.truncate()
fp.close()
if ("main.py" not in sys.argv[0]) and 配置格式有误:
instance.配置错误.exec()
if not 用户须知:
instance.版本提示.exec()
if instance.版本提示.clickedButton() == instance.版本提示A:
with open("ResourceFiles/Config/release_version.json",
"r+") as fp:
versionInfo = json.load(fp)
versionInfo['agreement'] = True
用户须知 = True
fp.seek(0)
json.dump(versionInfo, fp, ensure_ascii=False)
fp.truncate()
fp.close()
else:
os.system("taskkill /pid {} -f".format(主进程PID))
if ("main.py" not in sys.argv[0]
) and instance.通知时间 != 通知时间 and 多语言开关 == 0 and 自动检查更新 == 0:
instance.消息通知.exec()
if ("main.py" not in sys.argv[0]) and 展示信息 and 多语言开关 == 0:
QDesktopServices.openUrl(
QUrl('http://dnf.17173.com/jsq/changlog.html#/'))
except Exception as error:
logger.error("error={} \n detail {}".format(
error, traceback.print_exc()))
pass
else:
用户须知 = True
if 用户须知:
instance.thread_init()
app.exec_()
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/dcalc/DNFCalculating.git
git@gitee.com:dcalc/DNFCalculating.git
dcalc
DNFCalculating
Lv100
master

搜索帮助