吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1349|回复: 25
收起左侧

[Python 原创] AI 辅助开发的 生僻字速查应用,助力 古文阅读

  [复制链接]
pyjiujiu 发表于 2025-3-23 23:43


写在前面:  过程比较曲折,词典的文件转成 sqlite 用的db 后,大小有 224 MB,不知道怎么分享,主要也不确定 有没有更好的方法,加上时间有限,未能探索更多
所以 本篇仅分享源代码,还有 AI 开发过程的心得 (个人觉得,这些比软件本身有价值)

---分割线---


这次用的不是 名气很大的 deepseek,而是名气稍逊的 qwq-32B 的小模型 (地址:https://chat.qwen.ai/)

在发布之初,Qwen 官方(即阿里云)就宣称 可以对标 671B 满血的的DeepSeek-R1 (其中 370 亿被激活),
(发布页面:https://qwenlm.github.io/zh/blog/qwq-32b/)


qwq32jiemian.jpg


说实话,新闻是立即关注到了,但真的没当回事 (因为个人 日常关注很多 大语言模型的新闻,研究文章等,对各种吹牛 已经脱敏),
但是偶然用一下,发现挺让我震惊的

原因是 非常快(因为参数量小),而且你说啥都能听懂 (这个真了不起)
ds的 R1我也用很多次,但每次让其生成代码,都是不能运行的,不是一般的小问题,是很多问题(都不知道 怎么修)
(当然,也不是很公平,因为更早,然后 R1 的训练文档我也看了,ds 没来得及探索代码,明白就告诉读者这件事,软件工程是天生的弱点)

QwQ-32B, 最恐怖的地方在于,你只要让它生成脚本,基本都是直接可以运行的,,这还不算,你有什么问题,一句话,它都能立即理解到,然后迭代出解决方案。
就像汽车,有种指哪打哪的感觉 (是不是夸大,各位可以试试看)  很多其他更大的模型 都不一定能做到(比如gemini 就做不到)
正是基于这个原因,个人就决定,找个方向 去探索下,这个LLM 大语言小参数模型的极限,是否真的能让我做个软件出来

---分割线---

我的方向: 因为日常经常看古文,一直想有个应用 能够方便自己读古文,查查深僻字,最好是快速筛选出,然后点击一下就查询 (当然 还有更多想法,比如地图,这里不提)

为了上点强度,我决定挑战下,个人并不熟悉的 PyQt 来开发界面 ,(之前写了很多脚本,UI 也算熟悉,但都是 tkinter 开发的)
#也是 最近看到文章,说AI 时代,最好学难点 有点门槛的东西,因为 AI 会渐渐让这些门槛降低,相当于提前拥抱趋势

其次,还要挑战下 mdx ,这个词典文件,差不多用了10年了,但从来不敢自己去解析(#但 需要看情况,如果一切顺利的话,再考虑)

先展示下 最终版本软件界面:

jiemian1_resize.jpg

---分割线---

借助 qwq-32B 这样的大语言模型开发,我的体会

  • - 大模型本身:理解上下文窗口的大小,这个参数很重要,这个模型是最大 131K 的长度,每次生成量最高 8K,根据我的使用,在接近100K 的时候,生成就会出现很多错误
  • - 用户自己要 管理模块,除非是demo 一样的小任务,还是要分模块去开发,每次问一个主要的模块,然后进行迭代,(这次的项目,我就分了 深僻字生成button,和 词典查询 两个大模块,各迭代好多版本)
  • - 对于思考模型,要尽量给出明确的任务目标,,不要试图给例子,但可以提供资料,,语言

qwq 本身理解能力已经是顶级水平,所以 其实描述含混点 它也能理解,不过可能会产生偏差
这个项目 本人最初的要求写法就是 :
“帮我编写一个 GUI,用Python + pyQt6,作用是 输入一段文本如“古之学者必有师。师者,所以传道受业解惑也。”  能够立马在下面生成 不同字为text的 button,要求是,这些字 are not  included in "3500常见字"

LLM是这么思考的:
嗯,用户让我帮忙写一个Python的GUI程序,用PyQt6,功能是输入一段文本,然后生成按钮,这些按钮的文本是那些不在“3500常见字”里的字。首先,我需要理清楚用户的需求。用户希望输入文本后,立即生成按钮,每个按钮上的字都是文本中不在常用字列表中的字。那我得先确定几个关键点。

  • - 在用语上面,其实无所谓,个人建议 不要一板一眼,除非这个prompt 是要分享的,,因为我写的 很多英语,如”button“”text“ 正好对应到 GUI 开发的术语或参数,虽然看着很乱,但反而 让模型更快找到确定性。(#在 R1 训练文档中,其实模型 天然就是混合语言的,为了让其语言 修正过来,其实付出了 降低性能的代价)
  • - 尽可能给模型确定性,包括不限于 代码块,类的名,文件名,能去code 中复制出,就尽量不用自然语言,这么做的原因是,主要节省效率,模型有时候会有一些奇怪的行为,明明它正确理解了,但是侧重一些不重要的方面,很让人挫败

有一点要说明,当用户在prompt 中明确说明,也许会导致 LLM 在自己 think 区域内 ,不会明确细节,会直接转引上述用户的话,这个区别是好是坏  还是有待测试,不过目前来说没感觉到影响。

个人的迭代prompt:(继续迭代 这几个字,就明确了这次prompt 的任务目标,虽然好像不重要)
很好,继续迭代
1 我有个 common_words.txt  但里面的格式是 每一行以笔画开头,格式如 “【1画】 乙 一”,笔画后面就是汉字,且每个汉字都有空格隔开,此外 还需要排除 “#”开始的行
2 输入的 区域应该是 多行文本,不该是 QLineEdit,
3 全局 font 设置为 ”宋体“
4 点击每个 字-button,播放语音 参考代码是: import pyttsx3  pyttsx3.speak(words)

---分割线---

思路先分享到这,
下面是源代码

[Python] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
import sys
import re
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QTextEdit,QLineEdit, QPushButton, QScrollArea, QGridLayout, QLabel, QFrame, QSplitter
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QFont, QTextCharFormat,QTextCursor, QColor
import sqlite3
 
import pyttsx3   #离线语音,简单需求可用
import threading
import json
 
# A脚本的MDX查询模块(修改为QWidget)
class MDXDatabase:
    def __init__(self, db_path):
        self.db_path = db_path
        self.conn = None
        self.connect()
     
    def connect(self):
        try:
            self.conn = sqlite3.connect(self.db_path)
            self.conn.row_factory = sqlite3.Row
        except sqlite3.Error as e:
            raise ConnectionError(f"数据库连接失败: {str(e)}")
     
    def close(self):
        if self.conn:
            self.conn.close()
     
    def search_exact(self, keyword):
        try:
            cursor = self.conn.cursor()
            cursor.execute("SELECT paraphrase FROM mdx WHERE entry = ?", (keyword,))
            return [row[0] for row in cursor.fetchall()]
        except sqlite3.Error as e:
            raise sqlite3.Error(f"查询失败: {str(e)}")
     
    def search_fuzzy(self, keyword):
        try:
            cursor = self.conn.cursor()
            cursor.execute("SELECT paraphrase FROM mdx WHERE entry LIKE ?", (f"%{keyword}%",))
            return [row[0] for row in cursor.fetchall()]
        except sqlite3.Error as e:
            raise sqlite3.Error(f"查询失败: {str(e)}")
 
class MDXViewer(QWidget):
    def __init__(self, db_path):
        super().__init__()
        self.database = MDXDatabase(db_path)
        self.default_font = QFont("霞鹜文楷 屏幕阅读版", 10)
        self._stylesheet = {}
        self._init_ui()
        self._parse_stylesheet(mdx_stylesheet_text)
     
    def _init_ui(self):
        self.input_text = QLineEdit()
        self.input_text.setPlaceholderText("查询...")
        self.input_text.returnPressed.connect(self.on_query)
         
        self.query_button = QPushButton("查询")
        self.query_button.clicked.connect(self.on_query)
         
        self.text_edit = QTextEdit()
        self.text_edit.setFont(self.default_font)
        self.text_edit.setHtml("")
        self.text_edit.setReadOnly(True)
         
        layout = QVBoxLayout()
        h_layout = QHBoxLayout()
        h_layout.addWidget(self.input_text)
        h_layout.addWidget(self.query_button)
        layout.addLayout(h_layout)
        layout.addWidget(self.text_edit)
        self.setLayout(layout)
     
    def _parse_stylesheet(self, style_str):
        lines = style_str.splitlines()
        for i in range(0, len(lines), 3):
            number_line = lines[i].strip()
            if not number_line or not number_line.isdigit():
                continue
            number = number_line
            start_tag = lines[i+1].strip()
            end_tag = lines[i+2].strip()
            self._stylesheet[number] = (start_tag, end_tag)
     
    def _substitute_stylesheet(self, txt):
        txt_list = re.split(r"`\d+`", txt)
        tags = re.findall(r"`(\d+)`", txt)
        styled_txt = txt_list[0]
        for i, p in enumerate(txt_list[1:]):
            tag = tags[i]
            style = self._stylesheet.get(tag, ("", ""))
            start, end = style
            if p.endswith('\n'):
                p = p.rstrip('\n')
                styled_txt += f"{start}{p}{end}\n"
            else:
                styled_txt += f"{start}{p}{end}"
        return styled_txt
     
    def on_query(self,text_specify:str=''):
        keyword = text_specify or self.input_text.text()
        if not keyword:
            return
        try:
            results = self.database.search_exact(keyword)
            if not results:
                results = self.database.search_fuzzy(keyword)
            if results:
                raw_text = results[0]
                if raw_text.startswith("@@@LINK"): #繁体或会跳转的(@@@LINK=书 )
                    c = raw_text[8:].strip()
                    # print(c,len(c))
                    self.on_query(text_specify=c)
                    return
 
                styled_text = self._substitute_stylesheet(raw_text)
                self.text_edit.setHtml(styled_text)
            else:
                self.text_edit.setHtml(f"未找到与关键词“{keyword}”匹配的条目。")
        except Exception as e:
            print("错误", str(e))
 
# B脚本的主界面(整合A的组件)
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.default_font = QFont("霞鹜文楷 屏幕阅读版", 13)
        self.initUI()
        self.common_words = self.load_common_words()
        self.engine = pyttsx3.init()
        self.current_highlight_char = None
        self.stroke_counts = self.read_file_to_dict()
         
        # 初始化A的查询模块
        self.mdx_viewer = MDXViewer("汉语大辞典.db")
        self.right_container = QFrame()
        self.right_container.setLayout(QVBoxLayout())
        self.right_container.layout().addWidget(self.mdx_viewer)
        self.right_container.hide()
         
        # 布局设置
        self.splitter = QSplitter(Qt.Orientation.Horizontal)
        self.splitter.addWidget(self.left_container)
        self.splitter.addWidget(self.right_container)
        self.splitter.setSizes([800, 0])  # 初始隐藏右侧
         
        main_layout = QVBoxLayout()
        main_layout.addWidget(self.splitter)
        self.setLayout(main_layout)
     
    def initUI(self):
        self.setWindowTitle("生僻字分析器 & 词典查询")
        self.setGeometry(100, 100, 1200, 600)
        self.setFont(self.default_font)
         
        # 左侧布局
        self.left_container = QWidget()
        left_layout = QVBoxLayout()
         
        self.input_text = QTextEdit(acceptRichText=False)
        self.input_text.setPlaceholderText("输入文本,例如:古之学者必有师。师者,所以传道受业解惑也。")
        self.input_text.setFont(self.default_font)
        left_layout.addWidget(self.input_text)
         
        # 按钮行
        button_row = QHBoxLayout()
        self.process_btn = QPushButton("分析文本")
        self.process_btn.clicked.connect(self.process_text)
        self.dictionary_btn = QPushButton("词典")
        self.dictionary_btn.clicked.connect(self.toggle_dictionary)
        button_row.addWidget(self.process_btn)
        button_row.addWidget(self.dictionary_btn)
        left_layout.addLayout(button_row)
         
        # 按钮显示区域
        self.scroll_area = QScrollArea()
        self.scroll_area.setWidgetResizable(True)
        self.scroll_content = QWidget()
        self.scroll_layout = QGridLayout()
        self.scroll_content.setLayout(self.scroll_layout)
        self.scroll_area.setWidget(self.scroll_content)
        left_layout.addWidget(self.scroll_area)
         
        self.left_container.setLayout(left_layout)
     
    def load_common_words(self):
        try:
            with open('common_words.txt', 'r', encoding='utf-8') as f:
                words = []
                for line in f:
                    line = line.strip()
                    if not line or line.startswith('#'):
                        continue
                    try:
                        content = line.split('】', 1)[1].strip()
                        chars = content.split()
                        words.extend(chars)
                    except IndexError:
                        continue
                return words
        except FileNotFoundError:
            return ['的', '一', '是', '了', '我', '有', '人', '在', '他', '这']
     
    def process_text(self):
        text = self.input_text.toPlainText()
        unique_chars = set()
        for c in text:
            if self.is_chinese_char(c) and c not in self.common_words:
                unique_chars.add(c)
         
        # 清空布局
        while self.scroll_layout.count():
            item = self.scroll_layout.takeAt(0)
            widget = item.widget()
            if widget is not None:
                widget.deleteLater()
         
        row = 0
        col = 0
        for char in unique_chars:
            container = QWidget()
            container_layout = QVBoxLayout()
            container_layout.setSpacing(0)
            container_layout.setContentsMargins(0, 0, 0, 0)
             
            btn = QPushButton(char)
            btn.setFixedSize(60, 60)
            btn.setFont(QFont("霞鹜文楷 屏幕阅读版", 12))
            btn.clicked.connect(lambda _, c=char: self.button_clicked(c))
             
            char_unicode = hex(ord(char))[2:].upper()
            key = f"U+{char_unicode}"
            strokes = self.stroke_counts.get(key, "未知")
            strokes_str = f"笔画数:{strokes}"
            stroke_label = QLabel(strokes_str)
            stroke_label.setStyleSheet("color: gray; font-size: 10px;")
            stroke_label.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignBottom)
             
            container_layout.addWidget(btn)
            container_layout.addWidget(stroke_label)
            container.setLayout(container_layout)
            self.scroll_layout.addWidget(container, row, col)
            col += 1
            if col % 10 == 0:
                row += 1
                col = 0
     
    def speak(self, char):
        threading.Thread(target=self._speak, args=(char,), daemon=True).start()
     
    def _speak(self, char):
        self.engine.say(char)
        self.engine.runAndWait()
     
    def button_clicked(self, c):
        self.speak(c)
        self.highlight_char(c)
 
        # 触发A的查询
        self.mdx_viewer.input_text.setText(c)
        self.mdx_viewer.on_query()
     
    def highlight_char(self, char):
        cursor = self.input_text.textCursor()
        cursor.select(QTextCursor.SelectionType.Document)
        format = cursor.charFormat()
        format.setBackground(QColor(255,255,255))
        cursor.setCharFormat(format)
         
        text = self.input_text.toPlainText()
        current_pos = 0
        while True:
            pos = text.find(char, current_pos)
            if pos == -1:
                break
            cursor.setPosition(pos)
            cursor.movePosition(QTextCursor.MoveOperation.NextCharacter, QTextCursor.MoveMode.KeepAnchor)
            format = QTextCharFormat()
            format.setBackground(QColor(245, 209, 194))
            cursor.setCharFormat(format)
            current_pos = pos + 1
        cursor.clearSelection()
        self.input_text.setTextCursor(cursor)
     
    @staticmethod
    def is_chinese_char(c):
        return '\u4e00' <= c <= '\u9fff'
     
    def read_file_to_dict(self, file_path="unicode_Strokes_data.txt"):
        with open(file_path, "r", encoding="utf-8") as f:
            return json.load(f)
     
    def toggle_dictionary(self):
 
        current_sizes = self.splitter.sizes()
        if self.right_container.isHidden():
            # 显示右侧并设置尺寸为左侧60% 右侧40%
            total_width = sum(current_sizes)
            self.splitter.setSizes([int(total_width*0.618), int(total_width*0.382)])
            self.right_container.show()
        else:
            # 隐藏右侧时将尺寸设为0
            self.splitter.setSizes([current_sizes[0]+current_sizes[1], 0])
            self.right_container.hide()
 
# 风格表(来自A脚本)
mdx_stylesheet_text = """1
 
 
2
 
 
3
<font color="#950000">
 
4
</font>
 
5
<font color="#006AD5"><font size=-2 color=red face="DejaVu Sans"> &#9654; </font>
 
6
</font>
 
7
<b>
 
8
</b>
 
9
  
 
10
   
 
11
    
 
12
 
 
13
<com>
 
14
</com>
 
15
</font>
 
16
<font color=blueviolet>
 
17
<font color=green>
 
18
<font color=indigo>
 
19
<font color=red>
 
20
<font size=+1 color=maroon><b>
 
21
</b></font><br>
 
22
<span style="color: #FFFFFF; background-color: #367F36;font-family: Tahoma">
 
23
</span> 
 
"""
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setFont(QFont("霞鹜文楷 屏幕阅读版"))
    window = MainWindow()
    window.show()
    sys.exit(app.exec())


---分割线---

说明:
这个脚本要运行,需要额外的 三个文件:
- common_words.txt(2500个常见字),是网上胡乱找的
- unicode_Strokes_data.txt (笔画数)   来源是 https://www.unicode.org/Public/zipped/latest/ ,通过脚本提取 笔画数的字段
- 汉语大辞典.db  (文件太大 不作分享),这个文件是 用 库 mdict-utils , 在命令行 mdict -x dict.mdx --exdb 转成的,原mdx 是网上下载的词典文件


顺便分享下,提取 笔画数的字段的代码,很简单的(也是 qwq提供的)
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
import json
 
def extract_unicode_strokes(text):
    stroke_dict = {}
    lines = text.split('\n')
    for line in lines:
        line = line.strip()
        if not line or line.startswith('#'):
            continue
        parts = line.split('\t')
        if len(parts) >= 3 and parts[1] == 'kTotalStrokes':
            unicode_char = parts[0]
            strokes = parts[2]
            stroke_dict[unicode_char] = strokes
    return stroke_dict
with open("Unihan_IRGSources.txt", "r", encoding="utf-8") as f:
    text = f.read()
 
    # result =
with open("unicode_Strokes_data.txt", "w", encoding="utf-8") as f:
 
    json.dump(extract_unicode_strokes(text),f)


整个生成软件的过程,其实就类似 现在网上说的 vibe coding,,只是个人还是尽量依靠术语
其中有一些细节,如果不去照顾,很可能开发软件 会走不通

- 大模型在一些地方,可能会过度思考,(比如 我要复制到QEditText 的文字 是纯文本的形式,本来一个属性acceptRichText 即可,它却意图新建一个类,去接管复制的信号 )
- 有些错 会摸不着头脑,比如某次迭代 根据 stylesheet 是好像没什么问题,我也没有要求修改,检查一番发现,算法是 for i in range(0,len(lines),3) 是按照顺序来的,结果LLM在抄写字符串的时候,写成 """\n1 ,多了个换行符,就导致生成的 查询style 的dict 失效了,变空白(这种问题 其实也没有报错信息可看)
#大模型 会犯人 很难犯的错误,有时候作为用户会很意外,但是没必要直接放弃
- 其次是,LLM 并不能代替学习,比如 我之所以将 max 转成 db文件,是因为 现在知道的库,做查询 一个字词要一秒多,太慢了,大语言模型 未必能领会这个知识点,这种选择是大概率 只有自己才能判断
- 还有 怎么处理各个模块衔接,融合,怎么避开上下文不够的问题,这些都需要开发者 自己去探索,现行还没有一个成熟的标准解决方案

最后:
开发这个小软件,花费了我两天的时间,(其实大部分时间 是研究细节,学习代码库,mdx 的结构等),看似也算花费不短,但要是没有 AI,压根不太可能会去写,,预计要写 时间可能也至少一个星期起步。非常考验耐心,因为打造原型很慢,测试自己的想法 会很难得到立即的反馈。
而 qwq-32b 这种模型,就改变了我做法,很多问题 想法立马得到验证,这就让很多 原本不会存在的东西,有机会诞生出来。当然这里 还是有必要再提醒下  这只是32B参数的模型,在一年前这是很难想象的一件事,不知道怎么表达,有种深深的词穷的感觉,因为这个时代,惊讶 ,感叹 都不足以表达,也用的太多了。






jiemian1_resize.jpg

免费评分

参与人数 8威望 +1 吾爱币 +15 热心值 +7 收起 理由
abaooo + 1 + 1 我很赞同!
苏紫方璇 + 1 + 10 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
tomas1992 + 1 热心回复!
mengfeijie + 1 + 1 鼓励转贴优秀软件安全工具和文档!
xiaoman9527 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
laozhang4201 + 1 + 1 热心回复!
Hameel + 1 谢谢@Thanks!
MC12138 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

a105116 发表于 2025-3-24 02:06
是的,需求多了代码也多了,ai就不灵了,都是要会自己做模块拆分,分成很小一块一块去问ai,而不是全部一股脑儿丢进去。前几年ai画图刚起步也是,直到后面看了一个设计师对于ai画图的思考,以及基于他平时Photoshop的思考,提出了拆分画各个部分最后再拼一起。只能说本来就有经验和没有经验的使用起来还是有区别的。
dc111999 发表于 2025-3-24 01:16
lt6611896 发表于 2025-3-24 01:52
纯小白用kimi ai搞了个python编辑的pdf解析微信账单的小工具 完全对代码不懂  用了通灵义码用了dp用了 感觉还是kimi适合小白
MC12138 发表于 2025-3-23 23:48
评分了,感觉以后可能会用到
zhuoyao 发表于 2025-3-23 23:57
虽然看不懂原理,但是大为震撼
博爵 发表于 2025-3-24 00:04
这个模型第一次听说
happylkm 发表于 2025-3-24 00:15
试试看吧,好像不错的样子
jinqiaoa1a 发表于 2025-3-24 08:14
找不到运行程序下载地址,代码怎么用
hu123123123 发表于 2025-3-24 08:22
自从加入轮胎之后 发现学python迫在眉睫了 代码看不懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-23 19:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表