在 Ubuntu 上做 Python 图形界面,难点通常不在“能不能写出一个窗口”,而在于一开始该装什么、该选哪套库、后面怎么把界面和代码真正接起来。下面按“环境准备、库选型、安装方式、示例入门、进阶落地”的顺序梳理一遍,适合拿来作为第一次搭建桌面应用的起点,也方便你根据项目复杂度判断该用 Tkinter 还是 PyQt6、GTK 这类更完整的方案。
准备 Ubuntu 下的 Python GUI 开发环境
开始写界面前,先把基础运行环境配齐。Ubuntu 下这一步比较直接,重点是把 Python、pip、虚拟环境和开发头文件准备好。
安装 Python、pip 和基础依赖
- 更新软件包列表并安装 Python3 与 pip:
sudo apt update && sudo apt install python3 python3-pip - 安装 Python 开发工具,供部分需要编译的库使用:
sudo apt install python3-dev
可选:使用虚拟环境隔离项目依赖
如果你准备同时维护多个 GUI 项目,或者要测试不同版本的第三方库,建议直接启用虚拟环境,避免系统 Python 依赖互相影响。
- 创建并激活虚拟环境:
sudo apt install python3-venv && python3 -m venv venv && source venv/bin/activate
先选库:Ubuntu 上常见 Python GUI 方案怎么判断
真正影响开发体验的,往往不是安装命令,而是你一开始选了哪套 GUI 库。下面这些都是 Ubuntu 上比较常见的方案,但适用场景差异很明显。

Tkinter:最容易起步,适合快速原型
Tkinter 是 Python 标准库自带方案,优点是零安装成本、上手快,适合做小工具、表单、教学示例和原型验证。缺点也很明确:默认界面风格偏传统,想做得更现代,通常还要额外花时间调整。
PyQt5 / PyQt6:复杂桌面应用的常用选择
PyQt5/PyQt6 基于 Qt,布局、组件、跨平台支持都比较完整,适合做功能更复杂、界面更正式的桌面程序。它的优势在于专业度高、可扩展性强,但学习曲线也比 Tkinter 更陡。
Kivy、wxPython、PyGObject 适合哪些场景
- Kivy:开源跨平台库,支持多点触控,桌面端和移动端都能覆盖,但性能通常不如原生应用。
- wxPython:基于 wxWidgets,界面更接近本地应用外观,适合强调原生风格的程序,社区和文档都比较成熟。
- PyGObject(GTK+):GNOME 桌面环境的原生绑定,若你的应用要深度融入 Ubuntu / GNOME 生态,这一套通常最顺手,界面风格也更统一。
按需安装目标 GUI 库
选好方向之后,再执行对应安装命令即可。这里保留系统包和 pip 两种常见方式,便于按你的开发环境选择。
- Tkinter:通常随 Python 安装;若缺失可执行:
sudo apt install python3-tk - PyQt5:
pip install PyQt5,或使用系统包:sudo apt install python3-pyqt5 - PyQt6:
pip install PyQt6 - Kivy:
pip install kivy[base] - wxPython:
pip install wxPython,或使用系统包:sudo apt install python3-wxgtk4.0 - PyGObject(GTK+):
sudo apt install python3-gi gir1.2-gtk-3.0
快速上手:Tkinter 与 PyQt6 两种开发路径
如果你只是想先把第一个窗口跑起来,Tkinter 是最短路径;如果你已经确定要做稍复杂的桌面程序,PyQt6 的工作流更值得尽早熟悉。
Tkinter 示例:一个最小可用的交互窗口
下面这个例子包含标签、输入框、按钮和消息框,足够覆盖一个基础 GUI 程序的核心结构。
import tkinter as tk
from tkinter import messagebox
class SimpleTkinterApp:
def __init__(self, master):
self.master = master
master.title("Tkinter示例")
# 添加标签
label = tk.Label(master, text="请输入你的名字:")
label.pack(pady=10)
# 添加输入框
self.entry = tk.Entry(master, width=30)
self.entry.pack(pady=5)
# 添加按钮
button = tk.Button(master, text="打招呼", command=self.show_greeting)
button.pack(pady=10)
def show_greeting(self):
name = self.entry.get().strip()
if name:
messagebox.showinfo("欢迎", f"你好,{name}!")
else:
messagebox.showwarning("警告", "请输入名字!")
# 创建主窗口并运行
root = tk.Tk()
app = SimpleTkinterApp(root)
root.geometry("300x150")
root.mainloop()
这段代码展示了 Tkinter 的典型写法:创建主窗口、放入控件、给按钮绑定回调,再通过 mainloop() 进入事件循环。
PyQt6 示例:用 Qt Designer 设计界面再接入代码
PyQt6 的常见工作流不是手写全部界面,而是先用可视化工具设计,再把生成结果接入主程序。这样做在界面复杂时效率更高。
PyQt6 基本步骤
- 步骤1:安装 Qt Designer:
sudo apt install qttools5-dev-tools - 步骤2:在终端运行
designer,拖拽按钮等控件并保存为mainwindow.ui - 步骤3:把
.ui文件转换为 Python 代码:pyuic6 mainwindow.ui -o ui_mainwindow.py - 步骤4:编写主程序并绑定事件
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QMessageBox
from ui_mainwindow import Ui_MainWindow # 导入生成的UI类
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self) # 初始化UI
self.pushButton.clicked.connect(self.on_button_click) # 绑定按钮点击事件
def on_button_click(self):
self.statusbar.showMessage("按钮被点击了!", 3000) # 状态栏显示消息(3秒)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
这一套流程的重点在于把界面设计和业务逻辑拆开:界面结构交给 .ui 文件,交互逻辑写在主程序里,后续维护会轻松很多。
真正写项目时,几个细节最容易踩坑
入门示例能跑起来之后,实际项目里更容易出问题的反而是布局、事件、资源路径和打包分发这些细节。

布局管理:尽量别用绝对定位
无论是 Tkinter 还是 PyQt,绝对定位都很容易让窗口在不同分辨率、字体大小或系统缩放下出现错位。
- Tkinter 中优先考虑
pack或grid - PyQt 中优先使用
QVBoxLayout、QHBoxLayout等布局类 - 尽量避免
place或setGeometry这类硬编码位置的方式
事件处理:按钮能点只是开始,回调才是核心
图形界面的交互逻辑基本都围绕事件展开。Tkinter 常用 command 绑定按钮操作,PyQt 则通过 connect 把信号和槽函数接起来。写回调时要特别注意函数参数和控件状态的获取方式,避免界面有响应、逻辑却跑偏。
资源管理:界面文件和图标路径要提前理顺
- 用
pyuic6转换得到的.ui生成文件,通常需要和主程序放在同一目录,或者手动调整导入路径 - 如果项目开始变复杂,可以用
qrc文件统一管理图标、图片等资源,再通过pyrcc6转换为 Python 代码
这一步做得越早,后面迁移目录结构或打包时越省事。
打包发布:把脚本变成可分发程序
开发完成后,常见做法是用 PyInstaller 打包,让程序更容易分发。原文给出的命令如下:
pip install pyinstaller && pyinstaller --onefile --windowed your_script.py
实际操作时还要留意图标、图片、配置文件等数据文件路径,必要时额外指定资源文件,最终再根据分发需求整理成 .deb 或 .AppImage。
从哪条路线开始更合适
如果你的目标是尽快做出一个能用的小工具,Tkinter 依然是 Ubuntu 上最省事的起点;如果要做结构更完整、界面更专业的桌面应用,PyQt6 往往更值得投入。至于 GTK、wxPython、Kivy 这些方案,更适合在你已经明确“系统集成、原生风格、跨端触控”这些需求之后再定向选择。













