news 2026/8/6 2:55:23

Python 多继承 MRO、Pillow 与 Tkinter 模块详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 多继承 MRO、Pillow 与 Tkinter 模块详解

1. Python 多继承与 MRO(方法解析顺序)

在 Python 中,一个类可以继承自多个父类,这就是多继承。当多个父类中存在同名方法或属性时,Python 需要一套规则来决定调用哪一个,这套规则就是方法解析顺序(Method Resolution Order, MRO)

1.1 MRO 的计算规则

Python 3 统一使用C3 线性化算法来计算 MRO。其核心原则是:

  • 子类优先于父类
  • 多个父类按定义顺序从左到右
  • 保持单调性:如果一个类在 MRO 中出现在另一个类之前,那么在其所有子类的 MRO 中也应保持这个顺序

1.2 查看 MRO

可以通过类的__mro__属性或mro()方法查看:

class A: pass class B(A): pass class C(A): pass class D(B, C): pass print(D.mro) 输出:(<class 'main.D'>, <class 'main.B'>, <class 'main.C'>, <class 'main.A'>, <class 'object'>)

1.3 菱形继承问题

经典菱形继承结构:

class A: def show(self): print("A") class B(A): def show(self): print("B") super().show() class C(A): def show(self): print("C") super().show() class D(B, C): def show(self): print("D") super().show() d = D() d.show() 输出: D B C A

按照 MRO(D → B → C → A → object),super()会沿着这个顺序调用,确保了每个类的方法只被调用一次。

2. Pillow 图像处理模块

Pillow 是 Python 中最流行的图像处理库,是 PIL(Python Imaging Library)的友好分支。它支持多种图像格式的打开、操作和保存。

2.1 安装与基本使用

# 安装 # pip install Pillow from PIL import Image 打开图像 img = Image.open("example.jpg") 查看图像信息 print(img.format) # 格式 print(img.size) # 尺寸 (宽, 高) print(img.mode) # 模式 (RGB, RGBA, L 等) 显示图像(需要系统支持) img.show() 保存图像 img.save("output.png")

2.2 常用图像操作

# 调整大小 resized = img.resize((300, 200)) 旋转 rotated = img.rotate(45) 裁剪 box = (100, 100, 400, 300) # 左, 上, 右, 下 cropped = img.crop(box) 转换模式 gray_img = img.convert("L") # 转为灰度图 滤镜 from PIL import ImageFilter blurred = img.filter(ImageFilter.BLUR)

2.3 图像绘制与文字添加

from PIL import ImageDraw, ImageFont 创建绘制对象 draw = ImageDraw.Draw(img) 绘制矩形 draw.rectangle([(50, 50), (200, 150)], outline="red", width=3) 添加文字(需要字体文件) try: font = ImageFont.truetype("arial.ttf", 30) except: font = ImageFont.load_default() draw.text((100, 100), "Hello Pillow", fill="blue", font=font)

3. Tkinter GUI 编程模块

Tkinter 是 Python 的标准 GUI 库,基于 Tk GUI 工具包,可以快速创建桌面应用程序。

3.1 基本窗口创建

import tkinter as tk from tkinter import ttk 创建主窗口 root = tk.Tk() root.title("Tkinter 示例") root.geometry("400x300") # 宽x高 运行主循环 root.mainloop()

3.2 常用控件

# 标签 label = tk.Label(root, text="用户名:") label.pack() 输入框 entry = tk.Entry(root) entry.pack() 按钮 def on_click(): print("按钮被点击了") button = tk.Button(root, text="点击我", command=on_click) button.pack() 复选框 check_var = tk.IntVar() check = tk.Checkbutton(root, text="同意协议", variable=check_var) check.pack() 列表框 listbox = tk.Listbox(root) for item in ["Python", "Java", "C++", "JavaScript"]: listbox.insert(tk.END, item) listbox.pack()

3.3 布局管理

Tkinter 有三种布局管理器:

  • pack():简单堆叠
  • grid():网格布局
  • place():绝对位置
# pack 示例 label1 = tk.Label(root, text="标签1", bg="red") label1.pack(side="left", fill="y") label2 = tk.Label(root, text="标签2", bg="blue") label2.pack(side="top", fill="x") grid 示例 label3 = tk.Label(root, text="行0列0") label3.grid(row=0, column=0) label4 = tk.Label(root, text="行0列1") label4.grid(row=0, column=1) place 示例 label5 = tk.Label(root, text="绝对位置") label5.place(x=100, y=50)

3.4 事件绑定

def on_key(event): print(f"按下了: {event.char}") def on_mouse(event): print(f"鼠标位置: ({event.x}, {event.y})") 绑定键盘事件 root.bind("<Key>", on_key) 绑定鼠标事件 root.bind("<Button-1>", on_mouse) # 左键点击

4. 综合示例:图像查看器

结合 Pillow 和 Tkinter 创建一个简单的图像查看器:

import tkinter as tk from tkinter import filedialog from PIL import Image, ImageTk class ImageViewer: def init(self, root): self.root = root self.root.title("图像查看器") # 创建菜单 menubar = tk.Menu(root) filemenu = tk.Menu(menubar, tearoff=0) filemenu.add_command(label="打开", command=self.open_image) filemenu.add_separator() filemenu.add_command(label="退出", command=root.quit) menubar.add_cascade(label="文件", menu=filemenu) root.config(menu=menubar) # 创建标签显示图像 self.label = tk.Label(root) self.label.pack() def open_image(self): filepath = filedialog.askopenfilename( filetypes=[("图像文件", "*.jpg *.jpeg *.png *.gif *.bmp")] ) if filepath: # 使用 Pillow 打开图像 img = Image.open(filepath) img.thumbnail((800, 600)) # 缩略图 # 转换为 Tkinter 可显示的格式 photo = ImageTk.PhotoImage(img) # 更新标签 self.label.config(image=photo) self.label.image = photo # 保持引用 if name == "main": root = tk.Tk() app = ImageViewer(root) root.mainloop()

5. 总结

  • MRO:理解 Python 多继承的方法解析顺序,掌握super()在菱形继承中的调用链
  • Pillow:掌握图像的基本打开、保存、转换、裁剪、滤镜和绘制操作
  • Tkinter:掌握窗口创建、控件使用、布局管理和事件绑定,能够创建简单的 GUI 应用
  • 综合应用:结合 Pillow 和 Tkinter 可以创建实用的图像处理工具

这三个主题分别代表了 Python 在面向对象、图像处理和 GUI 编程方面的重要能力,掌握它们能够大大扩展 Python 的应用场景。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 2:54:49

一文读懂 RAG 混合检索:从切块、BM25、RRF 到 Qdrant 代码实践

当大模型需要回答企业制度、产品文档、技术手册等私有知识时&#xff0c;真正决定回答质量的&#xff0c;往往不只是模型有多强&#xff0c;而是系统能否先找到正确、完整、可追溯的资料。 一、RAG 到底解决什么问题 RAG 的全称是 Retrieval-Augmented Generation&#xff0c;…

作者头像 李华
网站建设 2026/8/6 2:52:51

依赖注入模式:从硬编码到松耦合的架构设计实践

1. 依赖注入模式&#xff1a;从“硬编码”到“软连接”的架构跃迁如果你写过一些规模稍大的代码&#xff0c;肯定遇到过这样的场景&#xff1a;一个类OrderService需要调用PaymentProcessor来处理支付&#xff0c;于是你顺手就在OrderService的构造函数里new了一个PaymentProce…

作者头像 李华
网站建设 2026/8/6 2:52:39

Linux文件创建全攻略:从touch到vim的实战场景解析

1. 从零开始&#xff1a;为什么我们需要掌握多种创建文件的方式&#xff1f;在Linux世界里&#xff0c;文件是操作系统与用户交互最核心的载体。无论是编写一个脚本、记录一段日志、还是配置一个服务&#xff0c;第一步往往都是创建一个文件。很多刚接触Linux的朋友&#xff0c…

作者头像 李华
网站建设 2026/8/6 2:51:11

LLM应用日志脱敏实战:从正则到NER的混合方案与工程架构

1. 项目概述&#xff1a;当LLM日志成为隐私泄露的“后门”最近在排查一个线上LLM应用的问题时&#xff0c;我翻看Trace日志&#xff0c;里面赫然躺着用户输入的完整身份证号和家庭住址。那一刻&#xff0c;后背有点发凉。我们花大力气在模型前端做输入过滤、在输出端做内容安全…

作者头像 李华
网站建设 2026/8/6 2:49:22

二叉树前中后序遍历

二叉树前中后序遍历 - 代码实现思路与图解 1. 项目概述 本项目实现了二叉树的三种遍历方式&#xff1a;前序遍历、中序遍历和后序遍历&#xff0c;均采用递归实现。 2. 数据结构定义 2.1 二叉树节点结构 typedef char BTDataType;typedef struct BinaryTreeNode {struct Binary…

作者头像 李华