Python GUI 图形化用户界面设计(基于tkinter库)

 写在前面

琦鱼 花了不少米在莫平台买了不少课,以下是针对 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 官网

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 文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云瑶琦鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值