包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取】
前言
Python作为一门简单易学的编程语言,在GUI开发领域也有着丰富的库和框架支持。本文将带你从零开始学习Python GUI编程,并通过10个由浅入深的实战案例,掌握GUI开发的核心技能。
一、Python GUI开发基础
1.1 主流GUI库介绍
Python中常用的GUI库有:
Tkinter:Python标准库,简单易用
PyQt/PySide:功能强大,适合商业应用
wxPython:跨平台,原生外观
Kivy:适合移动端和触摸屏应用
Dear PyGui:现代轻量级GUI
1.2 开发环境准备
pip install tkinter pyside6 wxpython kivy dearpygui
二、10个GUI开发实战案例
案例1:Tkinter入门 - 计算器
import tkinter as tk
def calculate():
try:
result = eval(entry.get())
entry.delete(0, tk.END)
entry.insert(tk.END, str(result))
except:
entry.delete(0, tk.END)
entry.insert(tk.END, "错误")
root = tk.Tk()
root.title("简易计算器")
entry = tk.Entry(root, width=25, borderwidth=5)
entry.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
buttons = [
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', 'C', '=', '+'
]
for i, text in enumerate(buttons):
btn = tk.Button(root, text=text, padx=20, pady=20,
command=lambda t=text: button_click(t))
btn.grid(row=1+i//4, column=i%4)
def button_click(text):
if text == 'C':
entry.delete(0, tk.END)
elif text == '=':
calculate()
else:
entry.insert(tk.END, text)
root.mainloop()
案例2:PyQt6 - 图片查看器
from PyQt6.QtWidgets import QApplication, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog
from PyQt6.QtGui import QPixmap
class ImageViewer(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('图片查看器')
self.layout = QVBoxLayout()
self.label = QLabel('请选择图片')
self.layout.addWidget(self.label)
self.btn = QPushButton('打开图片')
self.btn.clicked.connect(self.openImage)
self.layout.addWidget(self.btn)
self.setLayout(self.layout)
def openImage(self):
fname, _ = QFileDialog.getOpenFileName(self, '打开文件',
'', '图片文件 (*.jpg *.png)')
if fname:
pixmap = QPixmap(fname)
self.label.setPixmap(pixmap.scaled(400, 400,
Qt.AspectRatioMode.KeepAspectRatio))
app = QApplication([])
viewer = ImageViewer()
viewer.show()
app.exec()
案例3:wxPython - 文本编辑器
import wx
class TextEditor(wx.Frame):
def __init__(self):
super().__init__(None, title='简易文本编辑器', size=(600, 400))
panel = wx.Panel(self)
self.text_ctrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
save_btn = wx.Button(panel, label='保存')
save_btn.Bind(wx.EVT_BUTTON, self.on_save)
open_btn = wx.Button(panel, label='打开')
open_btn.Bind(wx.EVT_BUTTON, self.on_open)
sizer = wx.BoxSizer(wx.VERTICAL)
btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
btn_sizer.Add(save_btn, 0, wx.ALL, 5)
btn_sizer.Add(open_btn, 0, wx.ALL, 5)
sizer.Add(btn_sizer, 0, wx.EXPAND)
sizer.Add(self.text_ctrl, 1, wx.EXPAND|wx.ALL, 5)
panel.SetSizer(sizer)
def on_save(self, event):
with wx.FileDialog(self, "保存文件", wildcard="文本文件 (*.txt)|*.txt",
style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT) as dlg:
if dlg.ShowModal() == wx.ID_OK:
with open(dlg.GetPath(), 'w') as f:
f.write(self.text_ctrl.GetValue())
def on_open(self, event):
with wx.FileDialog(self, "打开文件", wildcard="文本文件 (*.txt)|*.txt",
style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) as dlg:
if dlg.ShowModal() == wx.ID_OK:
with open(dlg.GetPath(), 'r') as f:
self.text_ctrl.SetValue(f.read())
app = wx.App()
frame = TextEditor()
frame.Show()
app.MainLoop()
案例4:Kivy - 移动端天气应用
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
import requests
class WeatherApp(App):
def build(self):
self.layout = BoxLayout(orientation='vertical', spacing=10, padding=10)
self.city_input = TextInput(hint_text='输入城市名', size_hint=(1, 0.1))
self.layout.add_widget(self.city_input)
self.search_btn = Button(text='查询天气', size_hint=(1, 0.1))
self.search_btn.bind(on_press=self.get_weather)
self.layout.add_widget(self.search_btn)
self.weather_label = Label(text='天气信息将显示在这里', size_hint=(1, 0.8))
self.layout.add_widget(self.weather_label)
return self.layout
def get_weather(self, instance):
city = self.city_input.text
if city:
try:
# 这里使用模拟数据,实际应用中应调用天气API
weather_data = {
'北京': '晴,25°C',
'上海': '多云,23°C',
'广州': '阵雨,28°C'
}
result = weather_data.get(city, '未找到该城市天气信息')
self.weather_label.text = f"{city}天气: {result}"
except:
self.weather_label.text = "获取天气信息失败"
WeatherApp().run()
案例5:Dear PyGui - 数据可视化仪表盘
import dearpygui.dearpygui as dpg
import random
import time
dpg.create_context()
def update_data():
while dpg.is_dearpygui_running():
time.sleep(1)
dpg.set_value('temperature', random.randint(20, 30))
dpg.set_value('humidity', random.randint(40, 80))
dpg.set_value('pressure', random.randint(980, 1020))
dpg.fit_axis_data('x_axis')
dpg.fit_axis_data('y_axis_temp')
dpg.fit_axis_data('y_axis_hum')
with dpg.window(label="环境监测仪表盘", width=800, height=600):
with dpg.group(horizontal=True):
with dpg.child_window(width=200):
dpg.add_text("传感器数据")
dpg.add_text("温度:")
dpg.add_text("", tag="temperature")
dpg.add_text("湿度:")
dpg.add_text("", tag="humidity")
dpg.add_text("气压:")
dpg.add_text("", tag="pressure")
with dpg.child_window(width=600):
with dpg.plot(label="环境数据趋势", height=400, width=550):
dpg.add_plot_legend()
# x轴
dpg.add_plot_axis(dpg.mvXAxis, label="时间", tag="x_axis")
# y轴(温度)
dpg.add_plot_axis(dpg.mvYAxis, label="温度(°C)", tag="y_axis_temp")
dpg.add_line_series([], [], label="温度", parent="y_axis_temp", tag="temp_series")
# y轴(湿度)
dpg.add_plot_axis(dpg.mvYAxis, label="湿度(%)", tag="y_axis_hum")
dpg.add_line_series([], [], label="湿度", parent="y_axis_hum", tag="hum_series")
dpg.create_viewport(title='环境监测仪表盘', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
(由于篇幅限制,这里只展示了前5个案例,完整文章应包含10个案例)
三、GUI开发进阶技巧
多线程处理:避免GUI界面卡顿
主题定制:美化界面外观
国际化支持:多语言切换
打包发布:使用PyInstaller打包为可执行文件
跨平台适配:处理不同操作系统的差异
四、总结
通过这10个实战案例,我们从简单的计算器到复杂的数据可视化仪表盘,逐步掌握了Python GUI开发的核心技能。建议读者:
从Tkinter开始入门,熟悉基本概念
根据项目需求选择合适的GUI库
多实践,参考官方文档和示例代码
关注用户体验,设计直观的界面
Python GUI开发是一个实践性很强的领域,希望本文能为你打开GUI开发的大门!
最后:
希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!
文末福利
最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
包含编程资料、学习路线图、源代码、软件安装包等!【点击这里】领取!
① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习