当前位置:首页>python>18个爆火的Python实战项目,附源码资源+效果展示

18个爆火的Python实战项目,附源码资源+效果展示

  • 2026-07-02 22:32:43
18个爆火的Python实战项目,附源码资源+效果展示

1 python项目练习一:即时标记

这是《python基础教程》后面的实践,照着写写,一方面是来熟悉python的代码方式,另一方面是练习使用python中的基本的以及非基本的语法,做到熟能生巧。

这个项目一开始比较简单,不过重构之后就有些复杂了,但是更灵活了。

按照书上所说,重构之后的程序,分为四个模块:处理程序模块,过滤器模块,规则(其实应该是处理规则),语法分析器。

先来说处理程序模块,这个模块的作用有两个,一个是提供那些固定的html标记的输出(每一个标记都有start和end),另一个是对这个标记输出的开始和结束提供了一个友好的访问接口。来看下程序handlers.py:

这个程序堪称是整个“项目”的基石所在:提供了标签的输出,以及字符串的替换。理解起来也比较简单。

再来看第二个模块“过滤器”,这个模块更为简单,其实就是一个正则表达式的字符串。相关代码如下:

这就是三个过滤器了,分别是:强调牌过滤器(用×号标出的),url牌过滤器,email牌过滤器。熟悉正则表达式的同学理解起来是没有压力的。

再来看第三个模块“规则”,这个模块,抛开那祖父类不说,其他类应该有的两个方法是condition和action,前者是用来判断读进来的字符串是不是符合自家规则,后者是用来执行操作的,所谓的执行操作就是指调用“处理程序模块”,输出前标签、内容、后标签。来看下这个模块的代码,其实这个里面几个类的关系,画到类图里面看会比较清晰。rules.py:

这个模块里面的处理思路是,遍历客户端(也就是程序执行的入口)给插进去的所有的规则和过滤器,来处理读进来的文本。

有一个细节的地方也要说一下,其实是和前面写的呼应一下,就是在遍历规则的时候通过调用condition这个东西来判断是否符合当前规则。

我觉得这个程序很像是命令行模式,有空可以复习一下该模式,以保持记忆网节点的牢固性。

最后说一下我以为的这个程序的用途:

1、用来做代码高亮分析,如果改写成js版的话,可以做一个在线代码编辑器。

2、可以用来学习,供我写博文用。

还有其他的思路,可以留下您的真知灼见。

补充一个类图,很简陋,但是应该能说明之间的关系。另外我还是建议如果看代码捋不清关系最好自己画图,自己画图才能熟悉整个结构。

2 猜字游戏

在这个游戏中,你必须一个字母一个字母的猜出秘密单词。如果你猜错了一个字母,你将丢掉一条命。正如游戏名那样,你需要仔细选择字母,因为你的生命数量非常有限

import randomdef guess_word_game():    words = ["apple""banana""cherry""grape""orange"]    target_word = random.choice(words)    guessed_letters = []    attempts = 6    print("欢迎来到猜字游戏!")    print("提示:这个单词是一种水果。")    print("_ " * len(target_word))    while attempts > 0:        guess = input("请输入一个字母: ").lower()        if len(guess)!= 1 or not guess.isalpha():            print("请输入一个有效的字母。")            continue        if guess in guessed_letters:            print("你已经猜过这个字母了。")            continue        guessed_letters.append(guess)        if guess in target_word:            print("正确!")            display_word = ""            for letter in target_word:                if letter in guessed_letters:                    display_word += letter + " "                else:                    display_word += "_ "            print(display_word)            if "_" not in display_word:                print(f"恭喜你猜对了!答案是{target_word}。")                break        else:            attempts -= 1            print(f"错误!你还有{attempts}次机会。")    if attempts == 0:        print(f"游戏结束。答案是{target_word}。")

你可以这样调用这个游戏:

if __name__ == "__main__":    guess_word_game()
这个猜字游戏从给定的水果单词列表中随机选择一个单词,让玩家通过猜测单个字母来猜出这个单词。
玩家有 6 次错误猜测的机会。每次猜测后,游戏会显示已猜对的字母在单词中的位置,以及还剩下多少次机会。
如果玩家猜对了所有字母,游戏会显示祝贺消息并结束;如果玩家用完了所有机会,游戏会显示答案并结束。

3 骰子模拟器

可以通过选择1到6之间的随机整数,来完成骰子模拟。

import random设置最大值和最小值min_val =1max val = 6# 是否继续roll again = "yes"# 循环while roll _again == "yes" or roll _again == "y":print(“开始掷骰子”)print("般子数值是:)# 第一轮print(random.randint(min val, max val))# 第二轮print(random,randint(min_val, max_val))# 是否继续roll again = input("是否继续掷骰子?(是的话,输入yes或者y)")

④ 二维码

二维码是用于将数据编码和解码为机器可读的方法。包含一个白色背景上的黑色方块网格,可以被任何成像设备(如手机)读取

import pyqrcode设置二维码信息s= "https://www.baidu.com"# 生成二维码url = pyqrcode.create(s)# 保存二维码url,svg("baidu.svg",scale=8)

⑤ 语言检测

当你需要处理包含不同语言数据,且数据非常大的时候,语言检测就派上用场了。使用Python中的langdetect包,可以在几行代码内检测超过55种不同的语言。

from langdetect import detectext = input(“输入信息:")

⑥ 加密和解密

密码术意味着更改消息的文本,以便不知道你秘密的人永远不会理解你的消息。下面就来创建一个GUI应用程序,使用Python进行加密和解密在这里,我们需要编写使用无限循环的代码,代码将不断询问用户是否要加密或解

def encrypt(text, shift):    encrypted_text = ""    for char in text:        if char.isalpha():            if char.islower():                encrypted_char = chr((ord(char) - ord('a') + shift) % 26 + ord('a'))            else:                encrypted_char = chr((ord(char) - ord('A') + shift) % 26 + ord('A'))            encrypted_text += encrypted_char        else:            encrypted_text += char    return encrypted_textdef decrypt(text, shift):    return encrypt(text, 26 - shift)示例用法original_text = "Hello, World!"shift_value = 3encrypted = encrypt(original_text, shift_value)print(f"加密后的文本:{encrypted}")decrypted = decrypt(encrypted, shift_value)print(f"解密后的文本:{decrypted}")
在这个例子中,encrypt函数接受一个文本和一个偏移量作为参数,对文本中的字母进行加密。
如果字符是小写字母,将其转换为对应的加密后的小写字母;
如果是大写字母,进行类似的处理。非字母字符保持不变。
decrypt函数通过反向偏移量来解密文本,实际上就是再次调用加密函数,但使用反向的偏移量。

⑦ URL缩短

短网址由于易于记忆和输入,因此在数字营销领域非常受欢迎。这里给大家介绍一下,如何使用Python创建URL缩短器。

from flask import Flask, render_template, requestimport pyshortenersapp = Flask(__name__)@app.route('/', methods=['GET''POST'])def index():    short_url = None    if request.method == 'POST':        long_url = request.form['long_url']        s = pyshorteners.Shortener()        short_url = s.tinyurl.short(long_url)    return render_template('index.html', short_url=short_url)if __name__ == '__main__':    app.run(debug=True)

同时,你需要一个名为index.html的模板文件,内容如下:

<!DOCTYPE html><htmllang="en"><head>    <metacharset="UTF-8">    <title>URL Shortener</title></head><body>    <h1>URL Shortener</h1>    <formmethod="post">        <labelfor="long_url">输入长 URL:</label>        <inputtype="text"id="long_url"name="long_url">        <inputtype="submit"value="缩短">    </form>    {% if short_url %}    <p>缩短后的 URL:{{ short_url }}</p>    {% endif %}</body></html>

这个程序创建了一个简单的 Web 应用,用户在表单中输入一个长 URL,点击 “缩短” 按钮后,程序使用pyshorteners库将长 URL 缩短,并在页面上显示缩短后的 URL。

⑧ 音乐播放器

音乐播放器,可让你快速轻松地管理和收听所有音乐文件。应该不少小伙伴都使用过,网易云音乐、QQ音乐、酷狗音乐等,这里小F将使用Pygame和Tkinter,来创建一个音乐播放器

import tkinter as tkimport pygameclass MusicPlayer:    def __init__(self):        self.root = tk.Tk()        self.root.title("音乐播放器")        self.song_list = []        self.current_song_index = 0        self.load_button = tk.Button(self.root, text="加载音乐", command=self.load_songs)        self.load_button.pack()        self.play_button = tk.Button(self.root, text="播放", command=self.play_song)        self.play_button.pack()        self.pause_button = tk.Button(self.root, text="暂停", command=self.pause_song)        self.pause_button.pack()        self.next_button = tk.Button(self.root, text="下一首", command=self.next_song)        self.next_button.pack()        self.prev_button = tk.Button(self.root, text="上一首", command=self.prev_song)        self.prev_button.pack()        pygame.mixer.init()    def load_songs(self):        file_paths = tk.filedialog.askopenfilenames(filetypes=[("音频文件""*.mp3;*.wav")])        self.song_list = list(file_paths)    def play_song(self):        if self.song_list:            pygame.mixer.music.load(self.song_list[self.current_song_index])            pygame.mixer.music.play()    def pause_song(self):        pygame.mixer.music.pause()    def next_song(self):        if self.song_list:            self.current_song_index = (self.current_song_index + 1) % len(self.song_list)            self.play_song()    def prev_song(self):        if self.song_list:            self.current_song_index = (self.current_song_index - 1) % len(self.song_list)            self.play_song()    def run(self):        self.root.mainloop()if __name__ == "__main__":    player = MusicPlayer()    player.run()
这个音乐播放器可以加载多个音频文件,并提供播放、暂停、上一首和下一首的功能。
它使用tkinter创建了用户界面,使用pygame库来播放音乐。
请注意,在运行代码之前,请确保已经安装了pygame库。可以使用pip install pygame来安装。
选择音乐文件所在的文件夹,点击播放,即可听见音乐。

⑨ 生命游戏

生命游戏由英国数学家约翰·H·康威设计的,是一种类似于生物社会的兴衰和交替的游戏。
游戏使用无限大小的矩形网格,其中每个网格都是空的或被有机体占据。被占用的细胞是活的,而空的细胞是死的。
游戏在特定时期内进行,每一轮都会根据当前配置中生物体的排列创建一个新的世
下一代网格的状态,是通过将以下四个基本规则应用于当前配置的每个网格来确定的:
如果一个细胞还活着并且有两个或三个活着的邻居,那么该细胞在下一代中仍然活着;
一个没有活邻居或只有一个活邻居的活细胞会在下一代死于孤立,有四个或更多活邻居的活细胞会因下一代人口过剩而死亡
board = [[1, 0, 0], [1, 0, 0], [1, 0, 0]]邻居数组为给定的单元格找到8个相邻的单元格neighbors = [(1, 0), (1, -1), (0, -1), (-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1)]rows = len(board)cols = len(board[0])# 创建一个原始板的副本copy_board = [[board[row][col] for col inrange(cols)] for row inrange(rows)]# 逐个单元地迭代for row inrange(rows):for col inrange(cols):# 对于每个单元计算邻居的数量        live_neighbors = 0for neighbor in neighbors:            r = (row + neighbor[0])            c = (col + neighbor[1])# 检查相邻细胞的有效性,以及它是否原来是一个活细胞# 评估是针对副本进行的,因为它永远不会更新。if (r < rows and r >= 0) and (c < cols and c >= 0) and (copy_board[r][c] == 1):                live_neighbors += 1# 规则1或规则3if copy_board[row][col] == 1and (live_neighbors < 2or live_neighbors > 3):            board[row][col] = 0# 规则4if copy_board[row][col] == 0and live_neighbors == 3:            board[row][col] = 1print(board)

结果如下:

#输入board = [[100], [100], [100]]输出board = [[000], [110], [000]]

⑩5Turtle模块提供了在二维平面上移动的环境。

Turtle可以实现位置、航向和各种可能的状态和动作。

import turtle as turoo = tu.Turtle()  

创建对象wn = tu.Screen()  # 屏幕对象wn.bgcolor("black")  # 屏幕背景wn.title("分形树")roo.left(90)  # 移动roo.speed(20)  # 速度defdraw(l):  # 以长度'l'作为参数的递归函数if l < 10:returnelse:        roo.pensize(2)  # 设置画笔大小        roo.pencolor("yellow")  # 画笔颜色        roo.forward(l)  # 朝向        roo.left(30)  # 移动        draw(3 * l / 4)  # 绘制        roo.right(60)  # 移动        draw(3 * l / 4)  # 绘制        roo.left(30)  # 移动        roo.pensize(2)        roo.backward(l)  # 返回初始位置draw(20)  # 绘制20roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse:        roo.pensize(2)        roo.pencolor("magenta")  # magenta        roo.forward(l)        roo.left(30)        draw(3 * l / 4)        roo.right(60)        draw(3 * l / 4)        roo.left(30)        roo.pensize(2)        roo.backward(l)draw(20)roo.left(270)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse:        roo.pensize(2)        roo.pencolor("red")  # red        roo.forward(l)        roo.left(30)        draw(3 * l / 4)        roo.right(60)        draw(3 * l / 4)        roo.left(30)        roo.pensize(2)        roo.backward(l)draw(20)roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse:        roo.pensize(2)        roo.pencolor('#FFF8DC')  # white        roo.forward(l)        roo.left(30)        draw(3 * l / 4)        roo.right(60)        draw(3 * l / 4)        roo.left(30)        roo.pensize(2)        roo.backward(l)draw(20)########################################################defdraw(l):if (l < 10):returnelse:        roo.pensize(3)        roo.pencolor("lightgreen")  # lightgreen        roo.forward(l)        roo.left(30)        draw(4 * l / 5)        roo.right(60)        draw(4 * l / 5)        roo.left(30)        roo.pensize(3)        roo.backward(l)draw(40)roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse:        roo.pensize(3)        roo.pencolor("red")  # red        roo.forward(l)        roo.left(30)        draw(4 * l / 5)        roo.right(60)        draw(4 * l / 5)        roo.left(30)        roo.pensize(3)        roo.backward(l)draw(40)roo.left(270)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse:        roo.pensize(3)        roo.pencolor("yellow")  # yellow        roo.forward(l)        roo.left(30)        draw(4 * l / 5)        roo.right(60)        draw(4 * l / 5)        roo.left(30)        roo.pensize(3)        roo.backward(l)draw(40)roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse:        roo.pensize(3)        roo.pencolor('#FFF8DC')  # white        roo.forward(l)        roo.left(30)        draw(4 * l / 5)        roo.right(60)        draw(4 * l / 5)        roo.left(30)        roo.pensize(3)        roo.backward(l)draw(40)########################################################defdraw(l):if (l < 10):returnelse:        roo.pensize(2)        roo.pencolor("cyan")  # cyan        roo.forward(l)        roo.left(30)        draw(6 * l / 7)        roo.right(60)        draw(6 * l / 7)        roo.left(30)        roo.pensize(2)        roo.backward(l)draw(60)roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse:        roo.pensize(2)        roo.pencolor("yellow")  # yellow        roo.forward(l)        roo.left(30)        draw(6 * l / 7)        roo.right(60)        draw(6 * l / 7)        roo.left(30)        roo.pensize(2)        roo.backward(l)draw(60)roo.left(270)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse:        roo.pensize(2)        roo.pencolor("magenta")  # magenta        roo.forward(l)        roo.left(30)        draw(6 * l / 7)        roo.right(60)        draw(6 * l / 7)        roo.left(30)        roo.pensize(2)        roo.backward(ldraw(60)roo.right(90)roo.speed(2000)# recursiondefdraw(l):if (l < 10):returnelse:        roo.pensize(2)        roo.pencolor('#FFF8DC')  # white        roo.forward(l)        roo.left(30)        draw(6 * l / 7)        roo.right(60)        draw(6 * l / 7)        roo.left(30)        roo.pensize(2)        roo.backward(l)draw(60)wn.exitonclick()

绘制时间较长,结果如下,挺好看的。

⑪ 计算器

Kivy是一个免费的开源Python库,可以快速轻松地开发高度交互的跨平台应用程序

import tkinter as tkclass Calculator:    def __init__(self):        self.root = tk.Tk()        self.root.title("简单计算器")        self.expression = ""        self.display_var = tk.StringVar()        self.display = tk.Entry(self.root, textvariable=self.display_var, font=('Helvetica'20))        self.display.grid(row=0, column=0, columnspan=4)        buttons = [            '7''8''9''/',            '4''5''6''*',            '1''2''3''-',            '0''.''=''+',            'C' ]        row_val = 1        col_val = 0        for button in buttons:tk.Button(self.root, text=button, padx=20, pady=20, command=lambda b=button: self.button_click(b)).grid(row=row_val, column=col_val)            col_val += 1            if col_val > 3:                col_val = 0                row_val += 1def button_click(self, button):        if button == '=':            try:                result = str(eval(self.expression))                self.display_var.set(result)                self.expression = result            except:                self.display_var.set("错误")                self.expression = ""        elif button == 'C':            self.display_var.set("")            self.expression = ""        else:            self.expression += button            self.display_var.set(self.expression)    def run(self):        self.root.mainloop()if __name__ == "__main__":    calculator = Calculator()    calculator.run()

这个计算器可以进行基本的加、减、乘、除运算,并且有清除(C)和等于(=)按钮。

它使用 Tkinter 创建了一个简单的图形用户界面,包含一个显示区域和多个按钮。

当用户点击按钮时,相应的操作会被执行,结果会显示在显示区域中。

运行代码,出现一个计算器,非常好用!

⑫ 猜数游戏

猜数字游戏目的是猜测出程序想出的数字,基本逻辑:程序随机选择1到100之间的一个数字或任何其他数字组合,然后它会要求玩家输入它的建议。然后它会检查这个数字是否与计算机随机生成的数字相同;如果是,则玩家获胜

import random创建随机数n=random.randrange(1,100)# 获取输入guess =int(input("输入任意数值:"))while n!= guess:# 判断是否正确# 小于if guess < n:print("太小了")guess =int(input("再次输入数值:“))# 大于elif guess > n:print("太大了!")guess=int(input("再次输入数值:“))else:break

运行代码,结果展示:

⑬ 图像转换器

我们知道有大量的图像文件格式可用于存储图形数据,最流行的便是JPG和PNG。使用Python中的Tkinter库和PIL库,创建一个将PNG图像转换为JPG的应用程序。

from PIL import Imageimport osdef convert_image(input_path, output_path, output_format):    try:        img = Image.open(input_path)        img.save(output_path, format=output_format)        print(f"成功将 {input_path} 转换为 {output_path}")    except Exception as e:        print(f"转换失败:{e}")示例用法input_image_path = "input.jpg"output_image_path = "output.png"output_format = "PNG"convert_image(input_image_path, output_image_path, output_format)
在这个示例中,convert_image函数接受输入图像路径、输出图像路径和目标格式作为参数。
它使用Pillow库打开输入图像,然后将其保存为指定的格式。
你可以根据实际情况修改输入和输出路径以及目标格式。
请注意,确保已经安装了Pillow库,可以使用pip install Pillow进行安装。
运行代码,选择图片,点击转换按钮,即可完成图像格式变换。

⑭ 重量转换器

重量换算是指单位值乘以标准换算值,使用Python中的Tkinter库创建一个重量转换器应用程序

def convert_weight(value, from_unit, to_unit):    units = {        "gram"1,        "kilogram"1000,        "pound"453.592,        "ounce"28.3495    }    if from_unit not in units or to_unit not in units:        return "Invalid units"    return value * units[from_unit] / units[to_unit]示例用法weight = 100print(f"{weight} grams is {convert_weight(weight, 'gram''kilogram')} kilograms.")print(f"{weight} grams is {convert_weight(weight, 'gram''pound')} pounds.")print(f"{weight} grams is {convert_weight(weight, 'gram''ounce')} ounces.")

这个重量转换器函数接受三个参数:

要转换的数值、原始单位和目标单位。

它使用一个字典来存储不同单位之间的换算比例,然后根据给定的数值和单位进行换算。

你可以根据实际需求进行扩展和改进,比如添加用户输入功能,以便在运行时获取数值和单位。

运行代码,出现界面,输入数值,点击转换。

⑮ 年龄和性别检测

使用Python编程语言带你完成使用机器学习进行年龄和性别检测的任务
首先需要编写用于检测人脸的代码,因为如果没有人脸检测,我们将无法进一步完成年龄和性别预测的任务。
下一步是预测图像中人的性别。在这里,我将性别网络加载到内存中,并将检测的人脸通过网络传输,用于性别检测任务
下一个任务是预测图像中人类的年龄。这里我将加载网络并使用前向传递来获取输出。由于网络架构与性别网络相似,我们可以充分利用所有输出来获得任务的预期
以下是一个使用 Python 进行年龄和性别检测的示例代码,这里使用了第三方库face_recognition和opencv-python,请确保在运行代码前安装好这些库。
import face_recognitionimport cv2import numpy as npimport datetimedef detect_age_gender(frame):    face_locations = face_recognition.face_locations(frame)    for top, right, bottom, left in face_locations:        face_image = frame[top:bottom, left:right]使用深度学习模型进行性别和年龄预测        # 这里使用示例值,实际应用中需使用专业模型进行预测        gender = np.random.choice(['Male''Female'])        age = np.random.randint(1860)        cv2.rectangle(frame, (left, top), (right, bottom), (02550), 2)        cv2.putText(frame, f'{gender}{age} years old', (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (02550), 2)    return framecap = cv2.VideoCapture(0)while True:    ret, frame = cap.read()    if ret:        result_frame = detect_age_gender(frame)        cv2.imshow('Age and Gender Detection', result_frame)    if cv2.waitKey(1) & 0xFF == ord('q'):        breakcap.release()cv2.destroyAllWindows()

⑯ 人脸检测

构建一个检测人脸的程序是开始机器学习计算机视觉任务的好方法,使用Python的OpenCV库进行人脸检测的任务。

import cv2face cascade =cv2.CascadeClassifier("face detector.xml')img = cv2.imread('imagejpg’)faces =face cascade.detectMultiscale(img, 1.1,10)for (x, y, w, h) in faces:cv2.rectangle(img, (x, y). (x+w, y+h). (255, 0, 0). 2)cv2.imwrite("face detected.png", img)print('Successfully saved')

⑰ 铅笔素描

使用不到20行的Python代码将图像转换为铅笔素描

import cv2image = cv2.imread("dogjpg")cv2.imshow("Dog", image)cv2.waitKey(0)gray_image = cv2.cvtColor(image, cV2.COLOR BGR2GRAY)cv2.imshow("New Dog", gray _image)cv2.waitKey(0)inverted image =255 -gray _imagecv2.imshow("Inverted",inverted image)cv2.waitKey()blurred = cv2.GaussianBlur(inverted image, (2121), 0)inverted blurred= 255 -blurredpencil sketch =cv2.divide(gray image, inverted blurred, scale=256.0)cv2.imshow("Sketch",pencil sketch)cv2.waitKey(0)cv2.imshow("original image", image)cv2.imshow("pencil sketch", pencil sketch)

结果如下:

⑱ 文本编辑器

使用Python创建一个文本编辑器 GU,它可以创建、打开、编辑和保存文本文件。所有小部件的排列方式应使按钮小部件位于窗口布局的左侧,而文本框小部件位于

import tkinter as tkfrom tkinter import filedialogclass TextEditor:    def __init__(self, root):        self.root = root        self.root.title("简单文本编辑器")        self.text_area = tk.Text(root)        self.text_area.pack(fill=tk.BOTH, expand=True)        self.menu_bar = tk.Menu(root)        self.file_menu = tk.Menu(self.menu_bar, tearoff=0)        self.file_menu.add_command(label="打开", command=self.open_file)        self.file_menu.add_command(label="保存", command=self.save_file)        self.menu_bar.add_cascade(label="文件", menu=self.file_menu)        root.config(menu=self.menu_bar)    def open_file(self):        file_path = filedialog.askopenfilename()        if file_path:            with open(file_path, 'r'as file:                content = file.read()                self.text_area.delete(1.0, tk.END)                self.text_area.insert(tk.END, content)    def save_file(self):        file_path = filedialog.asksaveasfilename(defaultextension=".txt")        if file_path:            content = self.text_area.get(1.0, tk.END)            with open(file_path, 'w'as file:                file.write(content)if __name__ == "__main__":    root = tk.Tk()    editor = TextEditor(root)    root.mainloop()

这个文本编辑器具有打开和保存文件的功能。它使用 Tkinter 的菜单和文本区域来实现基本的文本编辑操作。

结果如下

总结

最后希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!

文末福利

最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
领取方式:看下图

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-02 23:32:21 HTTP/2.0 GET : https://f.mffb.com.cn/a/502404.html
  2. 运行时间 : 0.113110s [ 吞吐率:8.84req/s ] 内存消耗:4,735.16kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=47a9c4b77578c821b8119e90cdca5d75
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000527s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000777s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000296s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000307s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000506s ]
  6. SELECT * FROM `set` [ RunTime:0.000209s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000542s ]
  8. SELECT * FROM `article` WHERE `id` = 502404 LIMIT 1 [ RunTime:0.000652s ]
  9. UPDATE `article` SET `lasttime` = 1783006341 WHERE `id` = 502404 [ RunTime:0.019673s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000364s ]
  11. SELECT * FROM `article` WHERE `id` < 502404 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000570s ]
  12. SELECT * FROM `article` WHERE `id` > 502404 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000371s ]
  13. SELECT * FROM `article` WHERE `id` < 502404 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000707s ]
  14. SELECT * FROM `article` WHERE `id` < 502404 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000704s ]
  15. SELECT * FROM `article` WHERE `id` < 502404 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.010901s ]
0.115695s