1
+ import os
1
2
import sys
2
3
import pandas as pd
3
4
import tempfile
4
5
import random
6
+ import traceback
7
+ from loguru import logger
5
8
from PyQt5 .QtCore import *
6
9
from PyQt5 .QtWidgets import *
7
10
from PyQt5 .QtGui import QIcon ,QPainter ,QPixmap
8
11
from qfluentwidgets import *
9
12
10
13
temp_dir = tempfile .gettempdir ()
11
- VERSION = "2 .0.0dev "
14
+ VERSION = "v2 .0.0rel "
12
15
CODENAME = "Tribbie"
13
16
14
17
QApplication .setHighDpiScaleFactorRoundingPolicy (Qt .HighDpiScaleFactorRoundingPolicy .PassThrough )
@@ -19,10 +22,24 @@ class Config(QConfig):
19
22
allowRepeat = ConfigItem ("General" ,"allowRepeat" ,False ,BoolValidator ())
20
23
supportCS = ConfigItem ("General" , "supportCS" , False , BoolValidator ())
21
24
eco = ConfigItem ("Huanyu" , "ecoMode" , False , BoolValidator ())
25
+ logLevel = OptionsConfigItem ("Debug" , "logLevel" , "INFO" , OptionsValidator (["DEBUG" , "INFO" , "WARNING" ,"ERROR" ]), restart = True )
22
26
23
27
cfg = Config ()
24
28
qconfig .load ('config.json' , cfg )
25
29
30
+ if os .path .exists ("out.log" ):
31
+ os .remove ("out.log" )
32
+ logger .remove (0 )
33
+ logger .add ("out.log" )
34
+ logger .add (sys .stderr , level = cfg .get (cfg .logLevel ))
35
+
36
+ logger .info ("⌈缇宝,明天见⌋" )
37
+
38
+ def hookExceptions (exc_type , exc_value , exc_tb ):
39
+ error_details = '' .join (traceback .format_exception (exc_type , exc_value , exc_tb ))
40
+ logger .error (error_details )
41
+ sys .excepthook = hookExceptions
42
+
26
43
class Choose (QFrame ):
27
44
28
45
def __init__ (self , text : str , parent = None ):
@@ -87,6 +104,7 @@ def __init__(self, text: str, parent=None):
87
104
self .hBoxLayout .addWidget (self .table ,2 )
88
105
self .hBoxLayout .addWidget (self .opt ,3 ,Qt .AlignCenter )
89
106
self .setObjectName (text .replace (' ' , 'Choose' ))
107
+ logger .info ("主界面初始化完成" )
90
108
91
109
if cfg .get (cfg .eco ):
92
110
InfoBar .success (
@@ -98,6 +116,7 @@ def __init__(self, text: str, parent=None):
98
116
duration = 3000 ,
99
117
parent = self
100
118
)
119
+ logger .info ("NamePicker低碳模式将大幅降低碳排放,同时大幅增加设备寿命" )
101
120
102
121
def pick (self ):
103
122
global cfg
@@ -132,11 +151,13 @@ def pick(self):
132
151
while chs in self .chosen :
133
152
chs = random .randint (0 , le - 1 )
134
153
self .chosen .append (chs )
154
+ logger .debug (self .chosen )
135
155
return [tar [chs ], self .names [2 ][self .names [0 ].index (tar [chs ])]]
136
156
else :
137
157
return ["尚未抽选" , "尚未抽选" ]
138
158
139
159
def pickcb (self ):
160
+ logger .debug ("pickcb被调用" )
140
161
self .table .setRowCount (self .pickNum .value ())
141
162
namet = []
142
163
namel = []
@@ -149,10 +170,12 @@ def pickcb(self):
149
170
for i in namet :
150
171
namel .append ("%s(%s)" % (i [0 ], i [1 ]))
151
172
f .writelines (namel )
173
+ logger .info ("文件存储完成" )
152
174
else :
153
175
for i , t in enumerate (namet ):
154
176
for j in range (2 ):
155
177
self .table .setItem (i , j , QTableWidgetItem (t [j ]))
178
+ logger .debug ("表格设置完成" )
156
179
157
180
158
181
def loadname (self ):
@@ -181,7 +204,9 @@ def loadname(self):
181
204
self .numl [1 ].append (i )
182
205
self .numlen [0 ] = len (self .numl [0 ])
183
206
self .numlen [1 ] = len (self .numl [1 ])
207
+ logger .info ("名单加载完成" )
184
208
except FileNotFoundError :
209
+ logger .warning ("没有找到名单文件" )
185
210
with open ("names.csv" ,"w" ,encoding = "utf-8" ) as f :
186
211
st = ["name,sex,no\n " ,"example,0,1" ]
187
212
f .writelines (st )
@@ -193,6 +218,9 @@ def __init__(self, text: str, parent=None):
193
218
super ().__init__ (parent = parent )
194
219
self .setObjectName (text .replace (' ' , 'Settings' ))
195
220
self .df = QVBoxLayout (self )
221
+ self .scrollArea = ScrollArea ()
222
+ self .scrollArea .setWidgetResizable (True )
223
+ self .scrollArea .setHorizontalScrollBarPolicy (Qt .ScrollBarAlwaysOff )
196
224
self .optv = QWidget ()
197
225
self .opts = QVBoxLayout (self .optv )
198
226
self .sets = [SubtitleLabel ("常规" ),
@@ -207,7 +235,15 @@ def __init__(self, text: str, parent=None):
207
235
icon = FluentIcon .LINK ,
208
236
title = "课表软件联动" ,
209
237
content = "启用后将在ClassIsland/Class Widgets上(而非主界面)显示抽选结果,需要安装对应插件"
210
- ),
238
+ ),SubtitleLabel ("调试" ),
239
+ ComboBoxSettingCard (
240
+ configItem = cfg .logLevel ,
241
+ icon = FluentIcon .DEVELOPER_TOOLS ,
242
+ title = "日志记录级别" ,
243
+ content = "日志的详细程度" ,
244
+ texts = ["DEBUG" , "INFO" , "WARNING" ,"ERROR" ]
245
+ ),PushButton (FluentIcon .DOCUMENT ,"测试日志输出" ),
246
+ PushButton (FluentIcon .CLOSE ,"测试引发崩溃" ),
211
247
SubtitleLabel ("欢愉(太有乐子了)" ),
212
248
SwitchSettingCard (
213
249
configItem = cfg .eco ,
@@ -216,15 +252,25 @@ def __init__(self, text: str, parent=None):
216
252
content = "NamePicker致力于减少碳排放"
217
253
)]
218
254
for i in self .sets :
219
- self .opts .addWidget (i ,1 )
220
-
221
- self .scrollArea = SingleDirectionScrollArea (orient = Qt .Vertical )
222
- self .scrollArea .setWidget (self .optv )
255
+ self .opts .addWidget (i )
256
+ self .sets [5 ].clicked .connect (self .testLog )
257
+ self .sets [6 ].clicked .connect (self .testCrash )
223
258
self .scrollArea .setStyleSheet ("QScrollArea{background: transparent; border: none}" )
259
+ self .scrollArea .setWidget (self .optv )
224
260
self .optv .setStyleSheet ("QWidget{background: transparent}" )
225
-
226
261
self .df .addWidget (TitleLabel ("设置" ))
227
- self .df .addWidget (self .optv )
262
+ self .df .addWidget (self .scrollArea )
263
+
264
+ logger .info ("设置界面初始化完成" )
265
+
266
+ def testLog (self ):
267
+ logger .debug ("这是Debug日志" )
268
+ logger .info ("这是Info日志" )
269
+ logger .warning ("这是Warning日志" )
270
+ logger .error ("这是Error日志" )
271
+
272
+ def testCrash (self ):
273
+ raise Exception ("NamePicker实际上没有任何问题,是你自己手贱引发的崩溃" )
228
274
229
275
class About (QFrame ):
230
276
def __init__ (self , text : str , parent = None ):
@@ -245,6 +291,7 @@ def __init__(self, text: str, parent=None):
245
291
self .df .addWidget (self .author )
246
292
self .df .addWidget (self .cpleft )
247
293
self .df .addWidget (self .ghrepo )
294
+ logger .info ("关于界面初始化" )
248
295
249
296
class App (FluentWindow ):
250
297
def __init__ (self ):
@@ -256,6 +303,7 @@ def __init__(self):
256
303
self .About = About ("关于" , self )
257
304
self .initNavigation ()
258
305
self .initWindow ()
306
+ logger .info ("主界面初始化" )
259
307
260
308
def initNavigation (self ):
261
309
self .addSubInterface (self .Choose , FluentIcon .HOME , "随机抽选" )
0 commit comments