写在前面
琦鱼 花了不少米在莫平台买了不少课,以下是针对 python GUI 的相关学习笔记。
没有学历太难受了,光有技术可不行啊!业余道行才不看学历呢!
秉持着活到老学到老的信念,慢慢成为优秀的软件设计师。
文字太单调,直接看代码演示,代码每一行都有写注释。
开发环境 Python3.8
PyCharm 2020.1.3 (Professional Edition)
库安装命令:
pip install tkinter
窗体添加图片
使用tkinter库实现一个简单的窗体,并在窗体里添加一张图片,代码如下:
"""
使用 tkinter 库来实现 Python 窗体 GUI
"""
import tkinter as tk # 导入tkinter库
root = tk.Tk() # 创建一个名为root的窗体
root.title("Py窗体") # 设置窗体标题
# root.geometry("800x560") # 设置窗体大小
root.geometry("800x460+120+60") # 设置窗体大小及显示位置
root.resizable(False, False) # 设置窗体大小是否可变 False 为不可变 True 为可变(默认可变)
root.iconbitmap("wwn.ico") # 设置窗体图标
# root.configure(bg="blue") # 设置窗体背景颜色
root.config(bg="#202124") # 设置窗体背景颜色
text = tk.Label(root, text="滚一滚", bg="#202124", fg="#FFF", font=('楷体', 14, 'bold'))
# 设置一个文本标签及其背景颜色和前景颜色、字体及字体大小 样式(bold)
text.pack() # 将文本标签添加到窗体
photo = tk.PhotoImage(file='jww.png') # 创建 PhotoImage 对象并指定图片文件
lab = tk.Label(root, image=photo) # 创建一个标签(lab) 并将photo作为标签内容传入
lab.pack() # 将图片标签添加到窗体
root.mainloop() # 设置窗体可见(循环)
使用pillow库实现在窗体里添加图片,代码如下:
"""
为了更好的添加图片到窗体 ,这里用到了 pillow 库
"""
from tkinter import * # 导入 tkinter 库及加载其所有方法
from PIL import ImageTk, Image # 导入 PIL 库及加载 ImageTk和Image 方法
root = Tk() # 创建一个名为root的窗体
root.title("图片窗体") # 设置窗体标题
image = ImageTk.PhotoImage(Image.open("jww.png")) # 使用ImageTk.PhotoImage方法获取图片
label = Label(image=image) # 创建一个标签(lab) 并将image作为标签内容传入
label.pack() # 将图片标签添加到窗体
root.mainloop() # 设置窗体可见(循环)
Grid 布局
Grid 布局相关代码如下:
""" grid布局 网格布局 """
import tkinter as tk # 导入tkinter库并重命名为 tk
root = tk.Tk() # 创建一个名为root的窗体
root.title("Py窗体") # 设置窗体标题
# root.geometry("800x560") # 设置窗体大小
root.geometry("800x460+120+60") # 设置窗体大小及显示位置
tk.Button(root, text="按钮1").grid(row=0, column=0) # 创建一个按钮并使用grid布局
tk.Button(root, text="按钮2").grid(row=1, column=1)
tk.Button(root, text="按钮3").grid(row=2, column=2)
tk.Button(root, text="按钮4").grid(row=3, column=3)
tk.Button(root, text="按钮5").grid(row=4, column=4)
tk.Button(root, text="按钮6").grid(row=5, column=5)
root.mainloop() # 设置窗体可见
Pack 布局
Pack 布局相关代码如下:
""" pack 布局 """
import tkinter as tk # 导入tkinter库并重命名为 tk
root = tk.Tk() # 创建一个名为root的窗体
root.title("Py窗体") # 设置窗体标题
# root.geometry("800x560") # 设置窗体大小
root.geometry("800x460+120+60") # 设置窗体大小及显示位置
tk.Button(root, text="按钮").pack() # 创建一个按钮并使用pack布局
Bt0 = tk.Button(root, text="按钮0").pack(side="right") # 创建一个按钮并将按钮添加到窗体
# side 设置组件布局位置 right(右边)left(左边) bottom (底部) top (顶部)
Bt1 = tk.Button(root, text="按钮1").pack(expand="yes",fill="x") # 创建一个按钮并将按钮添加到窗体
# expand="yes" (扩展) fill="x" (水平方向填充组键) fill="y" (垂直方向填充组键)
Bt2 = tk.Button(root, text="按钮2").pack(side="top",pady="10")
Bt3 = tk.Button(root, text="按钮3").pack(side="top")
# pady="10" 按钮之间垂直方向间隔 10 像素
Bt4 = tk.Button(root, text="按钮4").pack(side="left",padx="10")
Bt5 = tk.Button(root, text="按钮5").pack(side="left")
# pady="10" 按钮之间水平方向间隔 10 像素
Bt6 = tk.Button(root, text="按钮6").pack(side="left",ipadx="10")
Bt7 = tk.Button(root, text="按钮7").pack(side="left")
# ipadx="10" (组建填充10像素,组建扩大 水平方向)
# ipady="10" (组建填充10像素,组建扩大 垂直方向)
root.mainloop() # 设置窗体可见
Place 布局
place 布局相关代码如下:
""" place 布局 绝对布局 灵活 """
import tkinter as tk # 导入tkinter库并重命名为 tk
root = tk.Tk() # 创建一个名为root的窗体
root.title("Py窗体") # 设置窗体标题
# root.geometry("800x560") # 设置窗体大小
root.geometry("800x460+120+60") # 设置窗体大小及显示位置
tk.Label(root, text="请输入姓名:").place(x=30, y=10) # 创建标签并使用place布局
tk.Entry(root).place(x=30, y=50) # 创建输入框并使用place布局
tk.Button(root, text="提交").place(x=30, y=90) # 创建一个按钮并使用place布局
# (x=0, y=0) 设置按钮的坐标
root.mainloop() # 设置窗体可见
'''
使用 place 布局需要注意的问题:
>>> 对于大型和复杂界面,手动设置每个小部件的位置可能会变得困难而且容易出错
>>> 如果窗体发生大小变化,需要手动调整小部件的大小和尺寸,因为 place 布局不会自动适应大小变化
>>> 如果小部件之间有重叠,可能会导致无法正常显示和交互
虽然 place 布局具有灵活性,但通常建议在简单布局中使用 pack 或 grid 布局管理器,而将 place 保留给需要更精确控制的特定情况
'''
鼠标事件处理
相关代码如下:
"""
事件绑定和处理
quit 退出
command 控制,指挥
click 点击
Motion 运动
"""
import tkinter as tk # 导入tkinter库并重命名为 tk
# 事件回调函数会自动接收一个参数(通常命名event),该参数包含有关事件的信息,如鼠标位置,按下的键值等。
def click(event):
print("鼠标单击:", event.x, event.y) # 获取鼠标实时在按钮上的坐标
# print("按钮点击触发!")
root = tk.Tk() # 创建一个名为root的窗体
root.title("Py事件窗体") # 设置窗体标题
root.geometry("500x460") # 设置窗体大小
button = tk.Button(root, text="关闭") # 创建一个关闭按钮
button.bind("<Motion>", click)
# <Button-1> 表示鼠标左键 <Button-2> 表示鼠标中键 <Button-3> 表示鼠标右键 <Motion> 表示鼠标运动
button.pack() # 设置按钮布局
# tk.Button(root, text="关闭", command=quit).pack() # 创建一个关闭按钮并使用 pack 布局
# command=quit (command :控制 指挥 quit 退出)command 事件
root.mainloop() # 设置窗体可见
键盘事件处理
相关代码如下:
"""
事件绑定和处理
quit 退出
command 控制,指挥
click 点击
Motion 运动
keypress 按键
"""
import tkinter as tk # 导入tkinter库并重命名为 tk
def key(event):
print("键盘事件触发:", event.keysym)
# 键盘事件触发时,def key函数被调用,事件返回键盘键值
root = tk.Tk() # 创建一个名为root的窗体
frame = tk.Frame(root, width=300, height=500) # 在窗体里设置一个容器,宽300,高500
frame.bind("<KeyPress>", key)
frame.pack() # 设置容器布局
frame.focus_set() # 设置焦点,已接收键盘事件
root.mainloop() # 设置窗体可见
警告弹窗
相关代码如下:
"""
弹窗,警告窗口
"""
import tkinter as tk # 导入tkinter库并重命名为 tk
win = tk.Tk() # 创建一个名为win的窗体
win.title("登录")
win.geometry("500x460") # 设置窗体大小
tk.Label(win, text="账号:").grid(row=0)
tk.Label(win, text="密码:").grid(row=2)
# 使用 grid 布局,将两个标签分别布置在第一行和第二行
e1 = tk.Entry(win) # 创建一个输入框控件
e2 = tk.Entry(win, show='*') # 创建一个输入框控件 以 * 号形式显示密码
e1.grid(row=0, column=1, padx=10, pady=5) # 控件设置为 grid 布局,并设置相关属性
e2.grid(row=2, column=1, padx=10, pady=5) # 控件设置为 grid 布局,并设置相关属性
tk.Button(win, text="登录", width=10).grid(row=3, column=0, padx=15, pady=5)
tk.Button(win, text="退出", width=10, command=win.quit).grid(row=3, column=1, padx=15, pady=5)
# 使用 grid() 的函数布局,并控制按钮的显示位置
win.mainloop() # 设置窗体可见
登录时的相关弹窗:
"""
弹窗,警告窗口
"""
import tkinter as tk # 导入tkinter库并重命名为 tk
from tkinter import messagebox # 导入messagebox模块
win = tk.Tk() # 创建一个名为win的窗体
win.title("登录")
win.geometry("500x460") # 设置窗体大小
tk.Label(win, text="账号:").grid(row=0)
tk.Label(win, text="密码:").grid(row=2)
# 使用 grid 布局,将两个标签分别布置在第一行和第二行
e1 = tk.Entry(win) # 创建一个输入框控件
e2 = tk.Entry(win, show='*') # 创建一个输入框控件 以 * 号形式显示密码
e1.grid(row=0, column=1, padx=10, pady=5) # 控件设置为 grid 布局,并设置相关属性
e2.grid(row=2, column=1, padx=10, pady=5) # 控件设置为 grid 布局,并设置相关属性
def login():
messagebox.showinfo("提示", "欢迎使用该软件!")
# 登录按钮被点击触发 login 函数,调用messagebox库的showinfo方法,该方法弹出一个提示窗口,内容:欢迎使用该软件!
tk.Button(win, text="登录", width=10, command=login).grid(row=3, column=0, padx=15, pady=5)
tk.Button(win, text="退出", width=10, command=win.quit).grid(row=3, column=1, padx=15, pady=5)
# 使用 grid() 的函数布局,并控制按钮的显示位置
win.mainloop() # 设置窗体可见
'''
在 tkinter 中,可以使用 messagebox 模块创建不同的提示窗口。
messagebox.showinfo(title, message) : 显示信息窗口,显示一般信息和成功消息
messagebox.showwarning(title, message) : 显示警告窗口,显示警告信息和提示消息
messagebox.showerror(title, message) : 显示错误窗口,显示错误信息和异常消息
messagebox.askquestion(title, message) : 显示询问窗口,显示用户是与否的问题
messagebox.askyesno(title, message) : 显示是与否选择窗口,让用户选择
messagebox.askokcancel(title, message) : 显示确定与取消选择窗口,让用户选择
messagebox.askyesnocancel(title, message) : 显示是与否和取消选择窗口,让用户选择
'''
多行文本框
相关代码如下:
"""
多行文本框
"""
import tkinter as tk # 导入tkinter库并重命名为 tk
wino = tk.Tk() # 创建一个名为wino的窗体
wino.title("多行文本框") # 设置窗体标题
wino.geometry("800x460+120+60") # 设置窗体大小及显示位置
textarea = tk.Text(wino, height=12, width=20, bg="#242528", fg="white", font=("楷体", 16))
# 设置一个多行文本框,指定高12,宽20,背景为黑色(#242528) 前景色为白色,设置字体为 楷体 字号 16
textarea.pack() # 选择布局方式
wino.mainloop() # 设置窗体可见
下拉选择菜单
相关代码如下:
"""
下拉选择菜单
"""
import tkinter as tk # 导入tkinter库并重命名为 tk
from tkinter import ttk # 导入ttk 模块
wino = tk.Tk() # 创建一个名为wino的窗体
wino.title("下拉菜单") # 设置窗体标题
wino.geometry("800x460+120+60") # 设置窗体大小及显示位置
cbox = ttk.Combobox(wino, width=16, font=("楷体", 16)) # 设置一个下拉菜单 宽16 字体为楷体 字体大小16
cbox['value'] = ('醉翁', '莲花', '瑶池') # 设置下拉菜单 的菜单项
cbox.pack() # 选择布局方式
wino.mainloop() # 设置窗体可见
登录验证
相关代码如下:
"""
用户登录时的密码验证
变动函数:login
"""
import tkinter as tk # 导入tkinter库并重命名为 tk
from tkinter import messagebox # 导入messagebox模块
win = tk.Tk() # 创建一个名为win的窗体
win.title("登录")
win.geometry("500x460") # 设置窗体大小
tk.Label(win, text="账号:").grid(row=0)
tk.Label(win, text="密码:").grid(row=2)
# 使用 grid 布局,将两个标签分别布置在第一行和第二行
e1 = tk.Entry(win) # 创建一个输入框控件
e2 = tk.Entry(win, show='*') # 创建一个输入框控件 以 * 号形式显示密码
e1.grid(row=0, column=1, padx=10, pady=5) # 控件设置为 grid 布局,并设置相关属性
e2.grid(row=2, column=1, padx=10, pady=5) # 控件设置为 grid 布局,并设置相关属性
def login():
username = e1.get() # 将e1用户输入的内容赋值给变量username
password = e2.get() # 将e2用户输入的内容赋值给变量password
if username == "qiyu" and password == "12345678":
messagebox.showinfo("提示", "登录成功!")
else:
messagebox.showerror("登录失败", "用户名或密码错误!")
# 使用 if... else (条件判断) 判断用户的账户密码是否正确
# 登录按钮被点击触发 login 函数,调用messagebox库的showinfo方法,该方法弹出一个提示窗口
tk.Button(win, text="登录", width=10, command=login).grid(row=3, column=0, padx=15, pady=5)
tk.Button(win, text="退出", width=10, command=win.quit).grid(row=3, column=1, padx=15, pady=5)
# 使用 grid() 的函数布局,并控制按钮的显示位置
win.mainloop() # 设置窗体可见
单选框和复选框
相关代码如下:
"""
单选框和复选框
"""
import tkinter as tk # 导入tkinter库并重命名为 tk
root = tk.Tk() # 创建一个名为root的窗体
root.title("Py窗体") # 设置窗体标题
root.geometry("800x460+120+60") # 设置窗体大小及显示位置
r1 = tk.Radiobutton(root, text="错", font=("楷体", 16), value=1) # 设置一个单选框 文本为 对 使用pack布局 设置字体字号
r1.pack()
r2 = tk.Radiobutton(root, text="错", font=("楷体", 16), value=1) # 设置一个单选框 文本为 错 使用pack布局 设置字体字号
r2.pack()
c1 = tk.Checkbutton(root, text="红", font=("楷体", 16))
c1.pack()
c2 = tk.Checkbutton(root, text="红", font=("楷体", 16))
c2.pack()
c3 = tk.Checkbutton(root, text="红", font=("楷体", 16))
c3.pack()
# 设置三个单选框 文本为 红 绿 蓝 使用pack布局 设置字体字号
root.mainloop() # 设置窗体可见
读取写入Excel 数据
相关写入代码如下:
import tkinter # 导入 tkinter 库
import tkinter as tk
from tkinter import ttk
from openpyxl import Workbook # 导入库,openpyxl用于处理Excel文件
win = tk.Tk()
win.title('ExcelDate') # 设置窗体标题
win.geometry("400x350") # 设置窗体大小
tk.Label(win, text="姓名:").grid(row=0) # 创建一个标签,使用grid布局,行=0
name = tk.Entry(win) # 创建 对应输入框 组件
name.grid(row=0, column=1, pady=5) # 使用grid布局,行=0 列=1 组建间距Y=5
tk.Label(win, text="课程:").grid(row=1) # 创建一个标签,使用grid布局,行=0
course = ttk.Combobox(win, width=18) # 创建下拉列表组件,设置宽18
course['value'] = ('语文', '数学', '英语') # 添加下拉列表选项
course.grid(row=1, column=1) # 使用grid布局,行=1 列=1
tk.Label(win, text="成绩:").grid(row=2) # 创建一个标签,使用grid布局,行=2
score = tk.Entry(win) # 创建 对应输入框 组件
score.grid(row=2, column=1, pady=5) # 使用grid布局,行=2 列=1 组建间距Y=5
def save(): # 点击"写入"按钮被触发的函数
wb = Workbook() # 创建一个新的工作簿
ws = wb.active # 选择默认的工作表
ws['A1'] = "姓名" # 写入内容到对应单元格 A1
ws['B1'] = "课程" # 写入内容到对应单元格 B1
ws['C1'] = "成绩" # 写入内容到对应单元格 C1
ws['A2'] = name.get() # 获取name输入框内容写入对应单元格 A2
ws['B2'] = course.get() # 获取name输入框内容写入对应单元格 B2
ws['C2'] = score.get() # 获取name输入框内容写入对应单元格 C2
wb.save("Date.xlsx") # 保存文件 "Date.xlsx"
tkinter.Button(win, text="写入", width=10, command=save).grid(row=3, column=1)
# 创建一个按钮,设置宽为10,绑定save事件,使用grid布局,行=3 列=1
win.mainloop() # 设置窗体可见
# 缺点:每运行一次,之前的数据会被覆盖;而且每次写入的数据有局限性,点击"写入"按钮后输入的数据没有清空
相关读取代码如下:
import tkinter as tk # 导入tkinter库
from openpyxl.reader.excel import load_workbook # 导入openpyxl库
win = tk.Tk() # 创建一个窗体
win.title("信息查询") # 设置窗体标题
win.geometry('340x200') # 设置窗体大小
def search(): # "查询" 按钮被点击的回调函数
name = namentry.get() # 获取输入框相关内容
workbook = load_workbook(filename='Date.xlsx') # 加载要查询的Excel文件
sheet = workbook.active
for row in sheet.iter_rows(values_only=True): # 遍历查找数据
if name in row:
score = row[2]
resultlabel.config(text="成绩:{}".format(score)) # 如果结果匹配就输出
return
resultlabel.config(text="未查询到相关成绩!") # 如果没有查询到结果就输出这句话
namelabel = tk.Label(win, text="请输入姓名:") # 创建一个标签
namelabel.pack() # 设置pack布局
namentry = tk.Entry(win) # 创建输入框
namentry.pack() # 设置pack布局
searchbutton = tk.Button(win, text="查询", command=search) # 创建一个按钮并绑定相关事件
searchbutton.pack() # 设置pack布局
resultlabel = tk.Label(win, text="") # 创建一个标签
resultlabel.pack() # 设置pack布局
win.mainloop() # 启动主循环 (设置窗体可见)
Json 数据交互
写入数据到 json 文件
"""
Json 数据交互 ( Json ==>> JavaScript Object Notation)
Json 特点:
1.简洁 2.可读性好 3.可扩展性强 4.跨平台和语言的互操作性 5.广泛支持
这是一个写入数据到 json 文件的程序
"""
import tkinter as tk # 导入tkinter库
import json # 导入 json 库
def save(): # "保存"按钮回调函数
date = {
'name': namentry.get(),
'score': scorentry.get()
}
with open('Date.json', 'a', encoding='utf-8') as file:
json.dump(date, file, ensure_ascii=False)
file.write('\n')
namentry.delete(0, tk.END) # 清空输入框
scorentry.delete(0, tk.END)
win = tk.Tk() # 创建一个窗体
win.title("JsonRead") # 设置窗体标题
win.geometry('340x270') # 设置窗体大小
namelabel = tk.Label(win, text="请输入姓名:") # 创建一个标签
namelabel.pack() # 设置pack布局
namentry = tk.Entry(win) # 创建一个输入框
namentry.pack() # 设置pack布局
scorelabel = tk.Label(win, text="语文成绩:") # 创建一个标签
scorelabel.pack() # 设置pack布局
scorentry = tk.Entry(win) # 创建一个输入框
scorentry.pack() # 设置pack布局
savebutton = tk.Button(win, text="保存", command=save) # 创建一个按钮并绑定事件
savebutton.pack() # 设置pack布局
win.mainloop() # 启动主循环 (设置窗体可见)
读取 Json 文件数据
"""
读取 Json 文件里的数据
"""
import json
import tkinter as tk # 导入tkinter库
def search(): # "查询" 按钮被点击的回调函数
name = namentry.get() # 获取输入框相关内容
with open('Date.json', 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
date = json.loads(line)
if date["name"] == name:
score = date["score"]
resultlabel.config(text="成绩:{}".format(score)) # 如果结果匹配就输出
return
resultlabel.config(text="未查询到相关成绩!") # 如果没有查询到结果就输出这句话
win = tk.Tk() # 创建一个窗体
win.title("信息查询") # 设置窗体标题
win.geometry('340x200') # 设置窗体大小
namelabel = tk.Label(win, text="请输入姓名:") # 创建一个标签
namelabel.pack() # 设置pack布局
namentry = tk.Entry(win) # 创建输入框
namentry.pack() # 设置pack布局
searchbutton = tk.Button(win, text="查询", command=search) # 创建一个按钮并绑定相关事件
searchbutton.pack() # 设置pack布局
resultlabel = tk.Label(win, text="") # 创建一个标签
resultlabel.pack() # 设置pack布局
win.mainloop() # 启动主循环 (设置窗体可见)
安装 MySQL数据库
MySQL 安装程序
1.到官网下载
2.双击打开安装程序
3.直接点击 下一步
4.勾选 接受协议许可,点击下一步
5.选择 典型类型,点击下一步
6.点击 安装
7.[安装过程]
8.点击 完成
9.点击 下一步
10.选择 安装位置 点击下一步
11.传输协议 和 端口 默认不修改,点击下一步
12.设置 root 密码,点击下一步
13.直接点击下一步
14.不修改,点击下一步
15.直接点击下一步
16.点击 执行
17.执行完成,点击下一步
18.点击 完成,安装结束
通过 cmd 操作 MySQL
打开 cmd (命令提示符&控制台&终端),打开的方式多种多样,我只讲我用的方式
按键盘上的 Win 加 r 键,在弹出的 运行 窗口输入 cmd 回车(enter键)或点击确定都行
以文件夹形式打开 MySQL 安装时的 bin 目录,将路径复制下来
在 cmd 里输入 cd 空格 加刚刚复制的路径(可用 Ctrl 加 c 键粘贴上)回车 (enter键)执行
# 你的 MySQL 安装路径可能和我的不一样
使用
为了方便实时调用 My SQL 相关程序,我这里配置了一下环境变量 path
cmd 里相关操作如下,文字这里就不多讲解了
Microsoft Windows [版本 10.0.19042.746]
(c) 2020 Microsoft Corporation. 保留所有权利。
C:\Users\Administrator>mysql -u root -p # 连接数据库登入root账户,输入安装时设置的密码
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.4.0 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database test; # 创建一个名为 test 的数据库
Query OK, 1 row affected (0.00 sec)
mysql> show databases; # 查看 数据库 列表
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test; # 选中名为 test 的数据库
Database changed
mysql> create table user(id int,name char(30)); # 添加一个列表,并在列表里添加id和name字段
Query OK, 0 rows affected (0.02 sec)
mysql> desc user; # 查看数据表
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | char(30) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into user values(1,'qiyu'); # 在表里插入一条数据
Query OK, 1 row affected (0.00 sec)
mysql> select * from user; # 查看表里的数据
+------+------+
| id | name |
+------+------+
| 1 | qiyu |
+------+------+
1 row in set (0.00 sec)
mysql> drop table user; # 删除列表
Query OK, 0 rows affected (0.01 sec)
mysql> drop database text; ### 输入错误 ###
ERROR 1008 (HY000): Can't drop database 'text'; database doesn't exist
mysql> drop database test; # 删除数据库 (test)
Query OK, 0 rows affected (0.00 sec)
mysql> show databases; # 重新查看数据库列表
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> exit # 退出 MySQL 数据库程序
Bye
C:\Users\Administrator>
写入数据到 MySQL
通过下面的程序将数据保存到 MySQL 数据库
pip install pymysql # 安装 pymysql 库
提前创建 数据库test 创建表,图形化界面程序代码如下:
"""
将数据写入 MySQL 数据库
"""
import tkinter as tk # 导入tkinter库
import pymysql # 导入pymysql库
def save():
name = namentry.get()
score = scorentry.get()
cnx = pymysql.connect( # 连接 MySQL 数据库
host='localhost', # 本机的地址及端口
user='root', # 账户 root
password='12345678', # 密码
database='test' # 指定数据库
)
cursor = cnx.cursor() # 创建游标对象
sql = "insert into user(name,score) values(%s,%s)" # sql 表示要执行的 sql 语句 %s是占位符
cursor.execute(sql, (name, score))
cnx.commit() # 提交事务
cnx.close() # 并关闭连接
# 清空输入框内容
namentry.delete(0, tk.END)
scorentry.delete(0, tk.END)
win = tk.Tk() # 创建一个窗体
win.title("WriteSQL") # 设置窗体标题
win.geometry('340x200') # 设置窗体大小
namelabel = tk.Label(win, text="姓名:") # 创建一个标签
namelabel.pack() # 设置pack布局
namentry = tk.Entry(win) # 创建输入框
namentry.pack() # 设置pack布局
scorelabel = tk.Label(win, text="成绩:") # 创建一个标签
scorelabel.pack() # 设置pack布局
scorentry = tk.Entry(win) # 创建输入框
scorentry.pack() # 设置pack布局
button = tk.Button(win, text="保存", command=save) # 创建一个按钮并绑定相关事件
button.pack() # 设置pack布局
win.mainloop() # 启动主循环 (设置窗体可见)
代码运行结果图:
数据库 数据 展示:
cmd 里 数据库 数据 展示:
Microsoft Windows [版本 10.0.19042.746]
(c) 2020 Microsoft Corporation. 保留所有权利。
C:\Users\Administrator>mysql -u root -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 8.4.0 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test;
Database changed
mysql> desc user;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(30) | YES | | NULL | |
| score | int | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.08 sec)
mysql> select * from user;
+------+-------+
| name | score |
+------+-------+
| 萌萌 | 99 |
| 玲玲 | 87 |
| 琪琪 | 90 |
+------+-------+
3 rows in set (0.01 sec)
mysql>
从 MySQL 读取数据
程序代码如下:
"""
读取数据库里的数据
"""
import tkinter as tk # 导入tkinter库
import pymysql # 导入pymysql库
win = tk.Tk() # 创建一个窗体
win.title("ReadSQL") # 设置窗体标题
win.geometry('340x200') # 设置窗体大小
cnx = pymysql.connect( # 连接 MySQL 数据库
host='localhost', # 本机的地址及端口
user='root', # 账户 root
password='12345678', # 密码
database='test' # 指定数据库
)
def search(): # 查询按钮回调函数
name = namentry.get() # 获取姓名输入框内容
cursor = cnx.cursor()
cursor.execute("select score from user where name=%s", name)
result = cursor.fetchone()
if result is not None: # 查找匹配的数据
score = result[0]
scorelabel.config(text=f"{name} 的成绩为:{score}") # 找到输出
else:
scorelabel.config(text=f"找不到{name} 的成绩") # 未找到输出
cursor.close() # 关闭查找
namelabel = tk.Label(win, text="请输入姓名:") # 创建一个标签
namelabel.pack() # 设置pack布局
namentry = tk.Entry(win) # 创建输入框
namentry.pack() # 设置pack布局
scorelabel = tk.Label(win) # 创建一个标签
scorelabel.pack() # 设置pack布局
button = tk.Button(win, text="查询", command=search) # 创建一个按钮并绑定相关事件
button.pack() # 设置pack布局
win.mainloop() # 启动主循环 (设置窗体可见)
cnx.close() # MySQL 关闭连接数据库
代码运行后的界面:
窗体主菜单
程序代码如下:
"""
给窗体添加 主菜单
tearoff=False :通过将 tearoff 设置为 False,从而使菜单不可拆分,
以确保始终与主窗体关联,无法单独悬浮显示
"""
import tkinter as tk # 导入tkinter库
win = tk.Tk() # 创建一个窗体
win.title("MainMenu") # 设置窗体标题
win.geometry('640x400') # 设置窗体大小
win.config(bg='black') # 设置窗体背景为黑色
menuMain = tk.Menu(win) # 创建主菜单
fileMenu = tk.Menu(menuMain, tearoff=False) # 在主菜单下创建文件菜单
menuMain.add_cascade(label="文件", menu=fileMenu) # 设置菜单名并绑定到文件菜单
fileMenu.add_command(label="打开") # 创建子选项菜单
fileMenu.add_command(label="保存")
fileMenu.add_separator() # 分割线
fileMenu.add_command(label="退出", command=quit)
editMenu = tk.Menu(menuMain, tearoff=False) # 在主菜单下创建编辑菜单
menuMain.add_cascade(label="编辑", menu=editMenu) # 设置菜单名并绑定到编辑菜单
editMenu.add_command(label="复制") # 创建子选项菜单
editMenu.add_command(label="粘贴")
editMenu.add_command(label="剪切")
win.config(menu=menuMain) # 将主菜单放入窗体里
win.mainloop() # 启动主循环 (设置窗体可见)
代码运行效果图如下:
程序的美化
使用到了 ttkbootstrap 库(不完善)
pip install ttkbootstrap # 安装ttkbootstrap 库
程序代码如下:
"""
图形化界面的优化 ttkrootstrap
styleboot :启动样式
"""
import tkinter as tk # 导入tkinter库
import ttkbootstrap as ttk # 导入ttkbootstrap库
from ttkbootstrap.constants import *
win = ttk.Window(title="BeautifScreen", # 创建一个窗体 设置窗体标题
themename="litera", # 设置主题
size=(320, 460), # 设置窗体大小
position=(500, 500), # 设置窗体显示位置
resizable=None, # 设置窗体大小固定 (不可更改)
alpha=0.9) # 设置窗体透明度
inputLabel = tk.Label(win, text="姓名:").grid(row=0, column=0, pady=10) # 创建标签并设置布局
inputentry = tk.Entry(win).grid(row=0, column=1, pady=10) # 创建输入框并设置布局
StarSignLabel = tk.Label(win, text="星座:").grid(row=1, column=0) # 创建标签并设置布局
StarSigncombobox = ttk.Combobox(win, values=[
"水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座"
], width=17).grid(row=1, column=1, pady=5) # 创建下拉列表并添加相关选项,设置宽度及布局
occupationLabel = tk.Label(win, text="从事的职业:").grid(row=2, column=0) # 创建标签并设置布局
occupation1 = ttk.Checkbutton(win, text="程序员", styleboot="selected").grid(row=2, column=1) # 创建复选框并设置布局
occupation2 = ttk.Checkbutton(win, text="网络工程师", styleboot="rounded toggle").grid(row=3, column=1)
occupation3 = ttk.Checkbutton(win, text="大数据工程师", styleboot="squared toggle").grid(row=4, column=1)
occupation4 = ttk.Checkbutton(win, text="硬件工程师").grid(row=5, column=1)
occupation5 = ttk.Checkbutton(win, text="前端开发").grid(row=6, column=1)
occupation6 = ttk.Checkbutton(win, text="后端开发").grid(row=7, column=1)
occupation7 = ttk.Checkbutton(win, text="软件架构师").grid(row=8, column=1)
occupation8 = ttk.Checkbutton(win, text="软件工程师").grid(row=9, column=1)
submitButton = ttk.Button(win, text="保存并提交", width=18, styleboot="danger").grid(row=5, column=1, pady=5) # 创建按钮并设置布局
clearButton = ttk.Button(win, text="取消并重置", width=18).grid(row=6, column=1)
win.mainloop() # 启动主循环 (设置窗体可见)
封装程序
pip install pyinstaller # 安装封装库 pyinstaller
pyinstaller --onefile --icon=fish.ico encapsulation.py # 执行封装
# 上面的命令里 fish.ico 是一个ico图标,encapsulation.py 是一个 python 文件