GUI 编程:turtle 与 PyQt
本教程共 70 篇 · 第 68 篇 · 更新于 2026-07-22 · 约 5 分钟阅读
68. GUI 编程:turtle 与 PyQt
本节目标:学会用 turtle 画简单图形,了解 PyQt 的基础用法,知道如何给 Python 程序加上图形界面。
命令行程序效率高,但对普通用户不友好。图形用户界面(GUI)让程序变得直观易用。Python 有多种 GUI 方案,这节介绍两个极端:极简的 turtle 和专业的 PyQt。
turtle:编程画画
turtle(海龟绘图)是 Python 内置的图形库,最初来自 Logo 语言。它用一只「海龟」在屏幕上移动,留下轨迹,非常适合编程入门和几何教学。
import turtle
# 画一个正方形
for _ in range(4):
turtle.forward(100)
turtle.right(90)
turtle.done()
turtle.forward(100) 让海龟前进 100 像素,turtle.right(90) 右转 90 度。turtle.done() 保持窗口不关闭。
画一个五角星:
import turtle
turtle.color('red', 'yellow')
turtle.begin_fill()
for _ in range(5):
turtle.forward(200)
turtle.right(144)
turtle.end_fill()
turtle.hideturtle()
turtle.done()
color('red', 'yellow')设置画笔颜色红色、填充颜色黄色。begin_fill()/end_fill()包围的区域会被填充。hideturtle()隐藏海龟图标,让画面更干净。
Tip画复杂图形时,用
turtle.speed(0)调到最快速度,或者turtle.tracer(0)关闭动画,画完再turtle.update()一次性刷新。
封装成函数复用:
import turtle
def draw_polygon(sides, length):
angle = 360 / sides
for _ in range(sides):
turtle.forward(length)
turtle.right(angle)
draw_polygon(6, 80)
turtle.done()
turtle 适合教小孩学编程、快速验证几何算法,但不适合写正经的桌面应用。
PyQt:专业级桌面应用
PyQt 是 Qt 框架的 Python 绑定,功能极其丰富:窗口、按钮、表格、树形控件、多线程、网络、数据库、OpenGL 应有尽有。大型桌面软件如 Anaconda Navigator、QGIS 都基于 Qt。
安装:
pip install PyQt6
NotePyQt 有多个版本:PyQt5、PyQt6、PySide2、PySide6。PyQt6 和 PySide6 对应 Qt6,是较新的版本。这节以 PyQt6 为例,API 大同小异。
第一个窗口
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('我的第一个 PyQt 程序')
self.resize(300, 200)
layout = QVBoxLayout()
self.label = QLabel('你好,PyQt!')
self.button = QPushButton('点我')
self.button.clicked.connect(self.on_click)
layout.addWidget(self.label)
layout.addWidget(self.button)
self.setLayout(layout)
def on_click(self):
self.label.setText('按钮被点击了!')
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())
代码结构:
QApplication:每个 PyQt 程序必须有且只有一个,管理事件循环。QWidget:所有界面控件的基类,可以当窗口用。QVBoxLayout:垂直布局,自动排列子控件。clicked.connect():把按钮的点击信号绑定到槽函数。app.exec():进入事件循环,等待用户交互。
常用控件一览
from PyQt6.QtWidgets import (
QLineEdit, QTextEdit, QComboBox, QCheckBox,
QSlider, QProgressBar, QMessageBox
)
# 输入框
line = QLineEdit()
line.setPlaceholderText('请输入姓名')
# 多行文本
text = QTextEdit()
text.setPlainText('默认内容')
# 下拉框
combo = QComboBox()
combo.addItems(['选项A', '选项B', '选项C'])
# 消息框
QMessageBox.information(self, '提示', '操作成功')
信号与槽
Qt 的核心机制是「信号与槽」。控件在特定事件发生时发射信号,槽函数接收并处理。
self.slider = QSlider()
self.slider.valueChanged.connect(self.update_label)
def update_label(self, value):
self.label.setText(f'当前值: {value}')
除了内置信号,你还可以自定义信号:
from PyQt6.QtCore import pyqtSignal
class Worker(QObject):
finished = pyqtSignal(str)
def run(self):
# 耗时操作...
self.finished.emit('任务完成')
Warning不要在主线程里执行耗时操作,否则界面会卡死。耗时应放到
QThread里,通过信号把结果传回主线程更新界面。
其他 GUI 方案速览
| 库 | 特点 | 适用场景 |
|---|---|---|
| tkinter | Python 内置,最简单 | 快速原型、小型工具 |
| turtle | 内置,教育向 | 编程教学、几何演示 |
| PyQt/PySide | 功能最全,商业成熟 | 大型专业桌面应用 |
| wxPython | 原生外观,跨平台 | 需要系统原生风格的程序 |
| Dear PyGui | GPU 加速,游戏风格 | 数据可视化工具、轻量面板 |
| Flet | 基于 Flutter,现代感 | 快速构建美观的跨平台应用 |
小结
- turtle 用「海龟」画图,简单有趣,适合入门和教学。
- PyQt 是功能最全面的 Python GUI 框架,信号与槽机制强大。
- 写 PyQt 程序记住模板:
QApplication-> 创建窗口 ->show()->exec()。 - 耗时不阻塞主线程,用
QThread+ 自定义信号保持界面响应。
来源:参考了 runoob「Python PyQt」、liaoxuefeng「18.1. 海龟绘图」等,改写后所得。