Python 图形用户界面详解(GUI,Tkinter)

1 概述

1.1 TK:窗口

import tkinter

# 定义窗口对象
window = tkinter.Tk()

# 设置窗口属性
window.title('我的第一个 GUI 程序')  # 标题
window.geometry('300x100+300+200')  # 位置及大小
# 格式:'wxh +-x +-y',其中
# wxh:表示 宽x高(字母 xyz 的 x)
#  +x:表示距屏幕左边的距离;-x 表示距屏幕右边的距离
#  +y: 表示距屏幕上边的距离;-y 表示距屏幕下边的距离

# 主循环:窗口一直存在(除非被关闭)
window.mainloop()

1.2 官方文档

2 组件

2.1 Label:标签

菜单结构:
在这里插入图片描述

from tkinter import *


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.label01 = Label(self, text="标签1", width=10, height=2, bg="black", fg="white")
        self.label01.pack()

        self.label02 = Label(self, text="标签2", width=10, height=2, bg="blue", fg="white", font=("黑体", 20))
        self.label02.pack()

        # 显示文本
        self.label03 = Label(self, text="段落1\n段落段落2\n段落段落段落3", borderwidth=1, relief="solid", justify="right")
        self.label03.pack()

        # 显示图片
        global photo
        photo = PhotoImage(file="images/1.gif")  # 暂支持的图片格式:png、gif
        self.label04 = Label(self, image=photo)
        self.label04.pack()


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x300+200+300")
    app = Application(master=window)

    window.mainloop()

效果预览:
在这里插入图片描述

2.2 Button:按钮

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        # 常规按钮
        self.btn01 = Button(self, text="登录", command=self.login)
        self.btn01.pack()

        self.btn02 = Button(self, text="登录2", command=self.login)
        self.btn02.config(state="disabled")  # 禁止登录
        self.btn02.pack()

        # 图片按钮
        global photo
        photo = PhotoImage(file="images/1.gif")
        self.btn03 = Button(self, image=photo, command=self.login)
        self.btn03.pack()

    def login(self):
        messagebox.showinfo("提示", "登录成功!")


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x200+200+300")
    app = Application(master=window)

    window.mainloop()

效果预览:
在这里插入图片描述

2.3 Entry:输入

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.label01 = Label(self, text="用户名")
        self.label01.pack()

        user_name = StringVar()
        self.entry01 = Entry(self, textvariable=user_name)
        self.entry01.pack()

        self.label02 = Label(self, text="密码")
        self.label02.pack()

        password = StringVar()
        self.entry02 = Entry(self, textvariable=password, show="*")
        self.entry02.pack()

        Button(self, text="登录", command=self.login).pack()

    def login(self):
        user_name = self.entry01.get()
        password = self.entry02.get()

        if user_name == 'admin' and password == '123456':
            messagebox.showinfo("提示", "登录成功!")
        else:
            messagebox.showinfo("提示", "登录失败,请检查用户名或密码!")


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x200+200+300")
    app = Application(master=window)

    window.mainloop()

效果预览:
在这里插入图片描述

2.4 Text:文本

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.text01 = Text(self, width=40, height=10, bg="gray")
        self.text01.pack()

        # 插入文本,格式:横坐标.纵坐标
        self.text01.insert(1.0, 'aaaaaaaaaaaaaaaa\nbbbbbbbbbbbbb')
        self.text01.insert(2.3, 'cccccccccccccccc\neeeeeeeeeeeee')

        Button(self, text="重复插入文本", command=self.insert_text).pack(side="left")

    def insert_text(self):
        self.text01.insert(INSERT, '鼠标光标处插入')
        self.text01.insert(END, '文本最后处插入')


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x200+200+300")
    app = Application(master=window)

    window.mainloop()

效果预览:
在这里插入图片描述

2.5 Radiobutton:单选框

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.default = StringVar()
        self.default.set("F")
        rb1 = Radiobutton(self, text="男性", value="M", variable=self.default)
        rb2 = Radiobutton(self, text="女性", value="F", variable=self.default)

        rb1.pack(side="left")
        rb2.pack(side="left")

        Button(self, text="确定", command=self.confirm).pack()

    def confirm(self):
        messagebox.showinfo("提示", "选择的性别的是:" + self.default.get())


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x200+200+300")
    app = Application(master=window)

    window.mainloop()

在这里插入图片描述

2.6 Checkbutton:复选框

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.code = IntVar()
        self.video = IntVar()
        print(self.code.get())  # 整数默认值是 0

        # onvalue=1, offvalue=0 表示:选中=1,未选中=0
        cb1 = Checkbutton(self, text="敲代码", variable=self.code, onvalue=1, offvalue=0)
        cb2 = Checkbutton(self, text="看视频", variable=self.video, onvalue=1, offvalue=0)

        cb1.pack(side="left")
        cb2.pack(side="left")

        Button(self, text="确定", command=self.confirm).pack()

    def confirm(self):
        if self.code.get() == 1:
            messagebox.showinfo("提示", f"已选中【敲代码】")
        if self.video.get() == 1:
            messagebox.showinfo("提示", f"已选中【看视频】")


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x200+200+300")
    app = Application(master=window)

    window.mainloop()

效果预览:
在这里插入图片描述

2.7 Canvas:画布

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        canvas = Canvas(self, width=300, height=200)
        canvas.pack()
        # 画一条直线。以 横坐标,纵坐标 两个为一组
        canvas.create_line(10, 10, 30, 20, 40, 50)
        # 画一个矩形。
        canvas.create_rectangle(50, 50, 100, 100)
        # 画一个椭圆
        canvas.create_oval(50, 50, 100, 100)


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x200+200+300")
    app = Application(master=window)

    window.mainloop()

预览效果:
在这里插入图片描述

2.10 Menu:菜单

from tkinter import *


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        menubar = Menu(self.master)

        # 创建一级菜单
        file_menu = Menu(menubar, tearoff=0)
        file_menu.add_command(label='打开')
        file_menu.add_command(label='新建')
        menubar.add_cascade(label="文件", menu=file_menu)

        # 创建二级菜单(三级菜单同理)
        edit_menu = Menu(file_menu, tearoff=0)
        edit_menu.add_command(label="修改")
        edit_menu.add_command(label="保存")
        file_menu.add_cascade(label="编辑", menu=edit_menu)

        # 将菜单加至主窗体中
        self.master.config(menu=menubar)


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x300+200+300")
    app = Application(master=window)

    window.mainloop()

效果预览:
在这里插入图片描述

3 布局管理器

布局管理器布局方式
pack水平、竖直
grid表格
place位置

3.1 pack:包

选项说明取值范围
side停靠方向top(上)、botton(下)、left(左)、right(右)
fill填充方式x(水平)、y(垂直)、both(水平+垂直)、none(不填充)
expand扩大方式True(随主窗体的大小变化)、False(不随主窗体变化)
anchor方向N(北)、S(南)、W(西)、E(东)、Center(中心) 等
ipandx、ipandy内边距非负整数
padx、pady外边距非负整数
from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        Button(self, text='A').pack(side=LEFT, expand=YES, fill=Y)
        Button(self, text='B').pack(side=TOP, expand=YES, fill=BOTH)
        Button(self, text='C').pack(side=RIGHT, expand=YES, fill=NONE)
        Button(self, text='D').pack(side=LEFT, expand=NO, fill=Y)
        Button(self, text='E').pack(side=TOP, expand=YES, fill=BOTH)
        Button(self, text='F').pack(side=BOTTOM, expand=YES)
        Button(self, text='G').pack(anchor=SE)


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x200+200+300")
    app = Application(master=window)

    window.mainloop()

效果预览:
在这里插入图片描述

3.2 grid:网格

选项说明取值范围
row单元格的行数从 0 开始的正整数
rowspan跨行,跨越的行数正整数
column单元格的列号从 0 开始的正整数
columnspan跨列,跨越的列数正整数
ipandx,ipandy子组件之间的间隔,按x、y 方向非负浮点数,默认 0.0
pandx,pandy并列组件之间的间隔,按x、y 方向非负浮点数,默认 0.0
sticky组件紧贴所在单元格的某一个角,如:东西南北等n、s、w、e、nw、sw、se、ne、center(默认)
from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.label01 = Label(self, text="用户名")
        self.label01.grid(row=0, column=0)
        self.entry01 = Entry(self)
        self.entry01.grid(row=0, column=1)

        Label(self, text="密码").grid(row=1, column=0)
        Entry(self, show="*").grid(row=1, column=1)


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x200+200+300")
    app = Application(master=window)

    window.mainloop()

效果预览:
在这里插入图片描述

3.3 place:位置

选项说明取值范围
x,y组件左上角的绝对坐标(相对于窗口)非负整数
relx,rely组件左上角的相对坐标(相对于父容器)0=最左边,0.5=正中间,1=最右边
width,height组件的宽度和高度(相对于窗口)
relwidth,relheight组件的宽度和高度(相对于父容器)
anchor对齐方式n、s、w、e、nw、ne、sw、se、center(默认)
from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        Button(self.master, text='A').place(x=0, y=0)
        Button(self.master, text='B').place(x=100, y=100, width=100, height=50)


if __name__ == '__main__':
    window = Tk()
    window.title("一个经典的GUI程序类的测试")
    window.geometry("400x200+200+300")
    app = Application(master=window)

    window.mainloop()

效果预览:
在这里插入图片描述

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鱼丸丶粗面

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

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

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

打赏作者

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

抵扣说明:

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

余额充值