首页 / Python3 入门教程 / GUI 编程:turtle 与 PyQt

Python3 入门教程

GUI 编程:turtle 与 PyQt

本教程共 70 篇 · 第 68 篇 · 更新于 2026-07-22 · 约 5 分钟阅读

PythonPython3 入门教程turtlePyQtGUI

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
Note

PyQt 有多个版本: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 方案速览

特点适用场景
tkinterPython 内置,最简单快速原型、小型工具
turtle内置,教育向编程教学、几何演示
PyQt/PySide功能最全,商业成熟大型专业桌面应用
wxPython原生外观,跨平台需要系统原生风格的程序
Dear PyGuiGPU 加速,游戏风格数据可视化工具、轻量面板
Flet基于 Flutter,现代感快速构建美观的跨平台应用

小结

  • turtle 用「海龟」画图,简单有趣,适合入门和教学。
  • PyQt 是功能最全面的 Python GUI 框架,信号与槽机制强大。
  • 写 PyQt 程序记住模板:QApplication -> 创建窗口 -> show() -> exec()
  • 耗时不阻塞主线程,用 QThread + 自定义信号保持界面响应。

来源:参考了 runoob「Python PyQt」、liaoxuefeng「18.1. 海龟绘图」等,改写后所得。