专栏首页小雨编程Python GUI编程:Tkinter

Python GUI编程:Tkinter

本节知识大纲:

Python里的图形化界面(GUI)模块主要有Tkinter(python自带)、PyQt、wxPython,我们这节主要讲解Tkinter组件:

一、Tkinter介绍

tkinter模块只要用户安装好Python环境就可以直接使用;

1. 第一个tkinter程序
import tkinter as tk  # 给tkinter重命名为tk
root = tk.Tk()  # 新建一个窗体
root.mainloop()  # 展示窗体
2. 设置属性并添加控件

设置窗体标题、指定窗体大小、添加按钮、输入框、标签并布局

import tkinter as tk  
root = tk.Tk()
# 为窗体设置一个标题
root.title("第一个tkinter窗体")
# 指定窗体的大小,这里的乘号是小写字母x
root.geometry("400x300")
# 添加一个标签
Label01 = Label(root,text = "第一个label标签")
# 将标签布局到窗体上
Label01.pack() 
# 添加一个按钮,可以在创建按钮的同时在句尾调用pack语句进行布局
Button01 = Button(root,text = "确定").pack()
# 添加一个单行文本框
Entry01 = Entry(root).pack()
# 展示窗体
root.mainloop()

二、控件的属性

1. tkinter常用的控件属性

(1)定义控件的名称使用参数text,传入的字符串值即为控件的名称;

(2)定义控件高度使用参数hight,宽度使用参数width,传入的值为整形数值;

(3)定义控件在空间中的位置,使用参数anchor,传入的字符参数为e、s、w、n以地图的东南西北来定义为右下左上,也可以同时设置左下sw、左上nw、右下se、右上ne;

(4)定义控件的背景色,使用参数bg,前景色使用参数fg,传入字符值可以直接是对应颜色的英文名称;

(5)设置布局在pack()函数里,使用参数side,传入的值为常量tk.LEFT或者tk.RIGHT,表示从左到右或者从右到左布局

(6)创建图片控件时,图片控件的文件源使用参数file,传入的字符值为为文件路径,在控件中使用图片则使用参数image,传入的值为图片控件变量;

(7)设置整个窗体的尺寸,使用参数geometry,传入的值为字符值,注意乘号用小写字母x代替;如果要设置长400宽300的窗体则使用语句geometry = "400x300"

(8)设置控件与边界的距离在pack函数里使用参数padx,设置左右距离,使用pady设置上下距离

2. 案例演示:画出一个简单的窗体布局
import tkinter as tk

# 新建一个窗体名称:root
root = tk.Tk()
# 为窗体添加一个标题
root.title("第二个Python窗体")

# 新建标签
photo = tk.PhotoImage(file = "/Users/yushengtan/Desktop/image.png")
Label01 = tk.Label(root,text = "第一个Label标签",anchor = "se").pack(side = tk.LEFT)
imageLable01 = tk.Label(root,image = photo).pack(side = tk.LEFT)
Label02 = tk.Label(root,text = "第二个Label标签",bg = "blue",fg = "white",font = ("华文宋体",20)).pack()
Label03 = tk.Label(root,text = "第三个Label标签",).pack()
Label04 = tk.Label(root,text = "第四个Label标签").pack()
Label05 = tk.Label(root,text = "第五个Label标签").pack()
Button01 = tk.Button(root,text = "确定").pack()

# 显示
root.mainloop()

效果演示:

3. 案例演示:画出能计算加法的计算器界面
# 导包的时候使用*,创建控件的时候不用写类名了
from tkinter import *

# 创建一个窗体,名称为root
root = Tk()
# 为窗体添加标题
root.title("求两数之和")
root.geometry("700x80")
photo = PhotoImage(file = "/Users/yushengtan/Desktop/calc.png")
# 定义控件
PhotoLabel = Label(root,image = photo).pack(side = LEFT,padx = 10,pady = 5)
# 第一个数字文本框
Entry01 = Entry(root,bg = "pink",width = 10,font = ("华文黑体",20)).pack(side = LEFT,padx = 5,pady = 5)
# 加号
Label_plus = Label(root,text = "+",font = ("华文黑体",20)).pack(side = LEFT,padx = 5,pady = 5)
# 第二个数字文本框
Entry02 = Entry(root,bg = "pink",width = 10,font = ("华文黑体",20)).pack(side = LEFT,padx = 5,pady = 5)
# 等于号
Label_equal = Label(root,text = "=",font = ("华文黑体",20)).pack(side = LEFT,padx = 5,pady = 5)
# 第三个数字文本框
Entry03 = Entry(root,bg = "green",width = 10,font = ("华文黑体",20)).pack(side = LEFT,padx = 5,pady = 5)
Button01 = Button(root,text = "计算",width = 10,height = 2,font = ("华文黑体",15)).pack(side = LEFT,padx = 10,pady = 5)

# 运行
root.mainloop()

界面效果:

三、基本布局

1. place绝对布局

pack布局是按顺序布局,而place布局可以直接定义绝对位置,只需要给place()函数里传入两个参数x和y,其值为整型数值表示相对于窗体左上角的坐标位置;用法如place(x=10,y=20)

案例演示:

绘制一个简易的登录界面

from tkinter import *

root = Tk()
root.title("用户登录")
root.geometry("400x180")

Label_username = Label(root,text = "登录名:",font = ("华为黑体",16)).place(x = 50,y = 20)
Entry_username = Entry(root,font = ("华文黑体",16),width = 20).place(x = 120,y = 20)
Label_password = Label(root,text = "密   码:",font = ("华为黑体",16)).place(x = 50,y = 60)
Entry_password = Entry(root,font = ("华文黑体",16),width = 20).place(x = 120,y = 60)
Button_login = Button(root,text = "登录",font = ("华文黑体",16),width = 8).place(x = 70,y = 120)
Button_cancer = Button(root,text = "取消",font = ("华文黑体",16),width = 8).place(x = 210,y = 120)

root.mainloop()
运行效果:
2. grid表格布局

grid是一种网格布局,grid(row = 1,column = 2),n行n列分别表示表格的行数和列数,从0开始计数;可以使用参数sticky控制控件靠近单元格的位置,字符值可以给出n、s、w、e设置上、下、左、右,我们还是以登录窗体为例:

# grid窗体布局
from tkinter import *

root = Tk()
root.title("用户登录")
root.geometry("450x160")

# 表格图片
photo = PhotoImage(file = "/Users/yushengtan/Desktop/login.png")
img_label = Label(root,image = photo).grid(row = 0,column = 0,rowspan = 2)
# 第一行 第二列
Label_username = Label(root,text = "用户名:",font = ("华文黑体",16)).grid(row = 0,column = 1)
# 第一行 第三列
Entry_username = Entry(root,font = ("华文黑体",16)).grid(row =0,column = 2)
# 第二行 第二列
Label_password = Label(root,text = "密  码:",font = ("华文黑体",16)).grid(row = 1,column = 1)
# 第二行 第三列
Entry_password = Entry(root,font = ("华文黑体",16)).grid(row =1,column = 2)
# 第四行 第二列
Button_login = Button(root,text = "登录",width = 8,font = ("华文黑体",16)).grid(row = 3,column = 2,sticky = "e")
# 第四行 第三列
Button_cancer = Button(root,text = "取消",width = 8,font = ("华文黑体",16)).grid(row =3,column = 2,sticky = "w")

root.mainloop()
输出效果:

注意:这里的红色辅助线是为了帮助理解表格布局

四、使用类封装GUI

这里我们使用类来封装GUI程序,以至于我们后面需要调用的时候直接实例化一个对象就可以产生一个窗口,类与对象的知识我们后面会深入讲解,现在我们只需怎么使用即可;我们把前面的登录窗口通过类来进行封装

from tkinter import *

class login_GUI(object):
    def __init__(self):
        """
        窗体的构造函数,用来做界面的初始化,GUI代码放在此函数中
        """
        self.frame = Tk()
        self.frame.title("登录窗体")
        self.frame.geometry("400x160")

        self.photo = PhotoImage(file="/Users/yushengtan/Desktop/login.png")
        imgLabel = Label(self.frame, image=self.photo).grid(row=0, column=0, rowspan=2)
        # 第一行 第一列
        Label_username = Label(self.frame, text="用户名:", font=("微软雅黑", 14)).grid(row=0, column=1)
        # 第一行 第二列
        Entry_username = Entry(self.frame, font=("华文黑体", 16)).grid(row=0, column=2)
        # 第二行 第二列
        Label_password = Label(self.frame, text="密  码:", font=("华文黑体", 16)).grid(row=1, column=1)
        # 第二行 第三列
        Entry_password = Entry(self.frame, font=("华文黑体", 16)).grid(row=1, column=2)
        # 第四行 第二列
        Button_login = Button(self.frame, text="登录", width=8, font=("华文黑体", 16)).grid(row=3, column=2, sticky="e")
        # 第四行 第三列
        Button_cancer = Button(self.frame, text="取消", width=8, font=("华文黑体", 16)).grid(row=3, column=2, sticky="w")

    def run(self):
        self.frame.mainloop()

if __name__ == '__main__':
    # 由窗体的模板实例化一个具体的登录窗体
    this_login = login_GUI()
    # 展示窗体
    this_login.run()

五、响应事件

以上我们实现了GUI界面的设计,加法计算器、登录窗口,但是没有程序并不能工作,如果想要程序工作起来还得给控件设置响应事件;

事件是什么呢?

事件就是响应某一个动作,如点击某一个按钮、输入键盘的某一个键等等。

我们现在来完善前面设计加法计算器,让其能真正做加法计算;

1. 完成点击按钮响应事件的步骤

(1)完成时间的功能---函数

(2)把功能捆绑到按钮上,添加command参数,其值为功能函数名,注意没有小括号

注意:取出文本框的数值可以使用get()方法;设置文本框的数值可以使用set()方法;控件基本属性的设定和控件的布局语句要分开;

2. 案例:实现两数相加的功能

通过响应事件完成加法计算器

# 实现加法计算器的的GUI界面
from tkinter import *
from tkinter.messagebox import  *

# 写一个类:实现两数相加的页面和功能
class get_sum(object):
    def __init__(self):
        # 新建一个窗体
        self.frame = Tk()
        # 窗体添加标题
        self.frame.title("实现两数相加")
        self.frame.geometry("700x80")
        self.photo = PhotoImage(file="/Users/yushengtan/Desktop/calc.png")
        # 定义控件
        self.img_Label = Label(self.frame, image=self.photo)
        self.img_Label.pack(side=LEFT, padx=10, pady=5)

        # 第一个数字文本框
        self.num01_Entry = Entry(self.frame, bg="pink", width=10, font=("华文黑体", 20))
        self.num01_Entry.pack(side=LEFT, padx=5, pady=5)

        # 加号
        self.Label01 = Label(self.frame, text="+", font=("华文黑体", 20))
        self.Label01.pack(side=LEFT, padx=5, pady=5)

        # 第二个数字文本框
        self.num02_Entry = Entry(self.frame, bg="pink", width=10, font=("华文黑体", 20))
        self.num02_Entry.pack(side=LEFT, padx=5, pady=5)

        # 等于号
        self.Label02 = Label(self.frame, text="=", font=("华文黑体", 20))
        self.Label02.pack(side=LEFT, padx=5, pady=5)

        # 第三个数字文本框
        self.var = StringVar()
        self.result_Entry = Entry(self.frame, bg="green", width=10, font=("华文黑体", 20),textvariable = self.var)
        self.result_Entry.pack(side=LEFT, padx=5, pady=5)

        self.cal_Button = Button(self.frame, text="计算", width=10, height=2, font=("华文黑体", 15),command = self.cal_sum)
        self.cal_Button.pack(side=LEFT, padx=10, pady=5)
    # 展示窗体
    def run(self):
        self.frame.mainloop()
    # 实现两数相加
    def cal_sum(self):
        # 先取出字符串
        num01 = self.num01_Entry.get()
        num02 = self.num02_Entry.get()
        # 判断
        if num01.isdigit() and num02.isdigit():
            self.var.set(str(int(num01) + int(num02)))
        else:
            showinfo("系统提示","输入的值不都是数字无法计算")

运行效果:

3. 案例:实现用户登录功能

需求

(1)如果用户名为admin,密码为123.com,显示登录成功!

(2)如果用户名不对,显示用户名不存在;

(3)如果密码不对,显示密码错误,如果错误三次,系统显示:账号已锁定。

提示

实现窗体的关闭,可以使用方法self.frame.destory()关闭窗体;

# 用户登录
from tkinter import *
from tkinter.messagebox import *

class login_GUI(object):
    def __init__(self):
        """
        窗体的构造函数,用来做界面的初始化,GUI代码放在此函数中
        """
        self.frame = Tk()
        self.frame.title("登录窗体")
        self.frame.geometry("400x160")

        self.photo = PhotoImage(file="/Users/yushengtan/Desktop/login.png")
        self.imgLabel = Label(self.frame, image=self.photo)
        self.imgLabel.grid(row=0, column=0, rowspan=2)
        # 第一行 第一列
        self.Label_username = Label(self.frame, text="用户名:", font=("微软雅黑", 14))
        self.Label_username.grid(row=0, column=1)
        # 第一行 第二列
        self.Entry_username = Entry(self.frame, font=("华文黑体", 16))
        self.Entry_username.grid(row=0, column=2)
        # 第二行 第二列
        self.Label_password = Label(self.frame, text="密  码:", font=("华文黑体", 16))
        self.Label_password.grid(row=1, column=1)
        # 第二行 第三列
        self.Entry_password = Entry(self.frame, font=("华文黑体", 16))
        self.Entry_password.grid(row=1, column=2)
        # 第四行 第二列
        self.Button_login = Button(self.frame, text="登录", width=8, font=("华文黑体", 16),command = self.login)
        self.Button_login.grid(row=3, column=2, sticky="e")
        # 第四行 第三列
        self.Button_cancer = Button(self.frame, text="取消", width=8, font=("华文黑体", 16),command = self.cancer)
        self.Button_cancer.grid(row=3, column=2, sticky="w")

        # 定义全局变量
        self.password_error_times = 0
        self.is_disable = False
    def run(self):
        self.frame.mainloop()

    def login(self):
        # 【1】先获取用户名和密码
        username = str(self.Entry_username.get())
        password = str(self.Entry_password.get())
        # 【2】验证
        if username.strip().lower() != "admin":
            showinfo("系统消息","用户名不存在,请核实后再登录!")
        elif password.strip() != "123.com":
            self.password_error_times += 1
            # 判断是否达到三次
            if self.password_error_times >= 3:
                self.is_disable = True
            # 判断禁用标志
            if self.is_disable:
                showinfo("系统消息","密码输入错误已达三次,账号已锁定,请联系管理员")
            else:
                showinfo("系统消息", "密码错误!")
        else:
            showinfo("系统消息","登录成功")
            # 如果在3次以内输入正确,则错误次数计数归零
            self.password_error_times = 0

    def cancer(self):
        # 实现窗体的关闭
        self.frame.destroy()

if __name__ == '__main__':
    # 由窗体的模板实例化一个具体的登录窗体
    this_login = login_GUI()
    # 展示窗体
    this_login.run()

实际效果:

六、GUI扩展功能

1. ttk模块

ttk模块是对传统tkinter模块的增强,传统的tkinter模块界面比较单一,控件种类有限,界面布局逻辑性差。ttk模块是tkinter下的一个子模块,它的界面比tkinter更丰富更美观。ttk的用法同tkinter大体相同,但是有一些属性ttk不再支持,而tkinter中的fg、bg、font属性在ttk中不再被支持,取而代之的是style对象;

2. 复选框Checkbutton
# Checkbutton控件
from tkinter import *
# from tkinter.ttk import *
from tkinter.messagebox import *

# 新建一个窗体还是需要tkinter
root = Tk()
root.geometry("450x100")
root.title("CheckButton控件")


#Label标签
Label01 = Label(root,text = "请选择你去过的城市")
Label01.grid(row = 0,column = 0,padx = 0,pady = 20)

city_list = ["北京","上海","广州","深圳","南京"]
# 用一组值存储选中哪些
is_check_list = []

# 通过循环展示
for city in city_list:
    is_check_list.append(IntVar())
    CheckButton01 = Checkbutton(root,text=city,variable = is_check_list[-1])    # 为啥是-1
    CheckButton01.grid(row = 0,column = len(is_check_list),padx = 5,pady = 5)

# sel函数
def sel():
    all_select = ""
    for i in range(0,len(is_check_list)):
        if is_check_list[i].get() == 1:
            all_select += city_list[i] + " "
    Label_select["text"] = "所选城市为:"+all_select

# 添加一个Button
Button01 = Button(root,text = "确认选择",command = sel)
Button01.grid(row = 1,column = 0,padx = 5,pady = 5)

# 添加一个Label标签,用于展示显示后的结果
Label_select = Label(root,text = "")
Label_select.grid(row = 1,column = 1,columnspan = 5)


# 加载
root.mainloop()

演示效果:

3. 单选框Radiobutton
# RadioButton
from tkinter import *
# from tkinter.ttk import *
# radiobutton --- 单选框----多个值中只能选一个
root = Tk()
root.title("RadioButton组件")
root.geometry("400x100")

def sel_gender():
    if gender_check.get() == 1:
        Label_select_gender["text"] = "男"
    else:
        Label_select_gender["text"] = "女"

def sel_education():
    Label_select_education["text"] = education_list[int(education_check.get())]

# 性别单选
Label_gender = Label(root,text = "性别:")
Label_gender.grid(row = 0,column = 0,padx = 5,pady = 5)

gender_check = IntVar()

# 用哪个变量接收它是否被选中,variable,绑定的值是同一个表示一组,variable通过get方法能获得value的值
# 最终选中后取什么值:value,同一组radiobutton中value的值最好是不同的
# 性别的单选
radio_boy = Radiobutton(root,text = "男",variable = gender_check,value = 1,command = sel_gender)
radio_boy.grid(row = 0,column = 1,padx = 5,pady = 5)
radio_boy = Radiobutton(root,text = "女",variable = gender_check,value = 0,command = sel_gender)
radio_boy.grid(row = 0,column = 2,padx = 5,pady = 5)
# 学历
education_list = ["高中","专科","本科","硕士","博士"]
Label_education = Label(root,text = "学历:")
Label_education.grid(row = 1,column = 0,padx = 5,pady = 5)

education_check = IntVar()
for i in range(0,len(education_list)):
    radio = Radiobutton(root,text = education_list[i],variable = education_check,value = i,command = sel_education)
    radio.grid(row = 1,column = i + 1,padx = 5,pady = 5)

Label01 = Label(root,text = "所选的值为:")
Label01.grid(row = 2 , column = 0)

Label_select_gender = Label(root,text = "")
Label_select_gender.grid(row = 2 , column = 1)
Label_select_education = Label(root,text = "")
Label_select_education.grid(row = 2 , column = 2)

# 展示控件
root.mainloop()

演示效果:

4. 下拉框ComboBox
# ComboBox
from tkinter import *
from tkinter.ttk import *

# ComboBox 控件 --- 下拉框单选
root = Tk()
root.title("ComboBox控件")
root.geometry("400x100")

# 做下拉选择的时候定义函数一定要使用可变长参数
def sel_gender(*args):
    Label_select_gender["text"] = combo_gender.get()

def sel_education(*args):
    Label_select_education["text"] = combo_education.get()

# 性别单选
Label_gender = Label(root,text = "性别")
Label_gender.grid(row = 0,column = 0,padx = 5,pady = 5)

gender = StringVar()
combo_gender = Combobox(root,textvariable = gender)
combo_gender["values"] = ["男","女"]  # 下拉列表填充
combo_gender["state"] = "readonly"  # 只允许读,如果没有这个参数,输入框可以输入值
combo_gender.current(0) # 默认情况下选择的值的索引
combo_gender.grid(row = 0 ,column = 1)

# 学历单选
education_list = ["高中","专科","本科","硕士","博士"]
Label_education = Label(root,text = "学历:")
Label_education.grid(row = 1,column = 0)

education = StringVar()
combo_education = Combobox(root,textvariable = education,values = education_list)
combo_education["state"] = "readonly"
combo_education.current(0)
combo_education.grid(row = 1,column = 1)

# 绑定选择性别的事件
combo_gender.bind("<<ComboboxSelected>>",sel_gender)
# 绑定选择学历的事件
combo_education.bind("<<ComboboxSelected>>",sel_education)

# 获取结果:
Label01 = Label(root,text = "所选的值为:")
Label01.grid(row = 2 , column = 0)
Label_select_gender = Label(root,text = "")
Label_select_gender.grid(row = 2,column = 1,sticky = "e")
Label_select_education = Label(root,text = "")
Label_select_education.grid(row = 2,column = 2,sticky = "w")

# 窗体展示
root.mainloop()

效果演示:

5. 容器LabelFrame

把具有相同功能的模块组合在一起,并且加上一个名字,这个控件能让你的界面更加有条理;

# LabelFrame
from tkinter import *
from tkinter.ttk import *

root = Tk()
root.title("LabelFrame控件")

LabelFrame_query = LabelFrame(root,text = "学生信息查询")
LabelFrame_query.pack(padx = 10,pady = 10)
# 如果不加控件的话,LabelFrame是看不见的

Label01 = Label(LabelFrame_query,text = "学号")
Label01.pack(side = LEFT,padx = 5,pady = 5)
Entry01 = Entry(LabelFrame_query,width = 10)
Entry01.pack(side = LEFT,padx = 5,pady = 5)
Label02 = Label(LabelFrame_query,text = "姓名")
Label02.pack(side = LEFT,padx = 5,pady = 5)
Entry02 = Entry(LabelFrame_query,width = 10)
Entry02.pack(side = LEFT,padx = 5,pady = 5)
Label03 = Label(LabelFrame_query,text = "班级")
Label03.pack(side = LEFT,padx = 5,pady = 5)
Entry03 = Entry(LabelFrame_query,width = 10)
Entry03.pack(side = LEFT,padx = 5,pady = 5)
Button01 = Button(LabelFrame_query,text = "查询",width = 5)
Button01.pack(side = LEFT,padx = 15,pady = 5)

root.mainloop()

运行效果:

6. 树状视图TreeView
# Treeview控件
from tkinter import *
from tkinter.ttk import *

root = Tk()
root.title("TreeView模块")
root.geometry("440x225")
# frame容器放置表格
frame01 = Frame(root)
frame01.place(x = 10,y = 10,width =420,height = 220 )
# 加载滚动条
scrollBar = Scrollbar(frame01)
scrollBar.pack(side = RIGHT,fill = Y)
# 准备表格TreeView
tree = Treeview(frame01,columns = ("学号","姓名","性别","年龄","手机号"),show = "headings",yscrollcommand = scrollBar.set)
# 设置每一列的宽度和对齐方式
tree.column("学号",width = 80,anchor = "center")
tree.column("姓名",width = 80,anchor = "center")
tree.column("性别",width = 60,anchor = "center")
tree.column("年龄",width = 60,anchor = "center")
tree.column("手机号",width = 120,anchor = "center")
# 设置表头的标题文本
tree.heading("学号",text = "学号")
tree.heading("姓名",text = "姓名")
tree.heading("性别",text = "性别")
tree.heading("年龄",text = "年龄")
tree.heading("手机号",text = "手机号")
# 设置关联
scrollBar.config(command = tree.yview)
# 加载表格信息
tree.pack()
# 插入数据
for i in range(10):
    # i 是索引
    tree.insert("",i,values=["9500"+str(i),"张三","男","23","15622338793"])
# 展示
root.mainloop()

运行效果:(注意这里只是为了演示效果,数据只是同一个数据重复输出)

7. Style属性

增强的ttk包里没法用tkinter的传统属性进行设置比如bg和fg,我们需要通过style对象来对其设置;

注意:我们对实例化对象style01进行配置,

style01.configure("TLabel",font = ("华文黑体",18),background = "green",foreground = "blue")

第一个参数不是对象的名称,而是对象的某一类,其名称是有规定的,不是随便取的,由于这里是对Label 的style进行命令,所以我们只能命名成TLabel,具体的组件与名称的对应关系如下:

疑问

如果此时创建一个Label02对象它的style属性没有绑定style01对象,但是它的属性依然是style01对象里定义的特征,这是怎么回事呢?

解答

其实只要在配置style的时候,填写标准的Stylename,后面无论某个控件是否绑定,Stylename 对应的控件都会生效;

from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("style属性")
root.geometry("300x200")

# 实例化一个style对象style01
style01 = Style()
# 对style01进行配置,Stylename属性设置为标准的TLable
style01.configure("TLabel",font = ("华文黑体",18),background = "green",foreground = "blue")
# 把Label01控件绑定给style01对象
Label01 = Label(root,text = "用户名",style = "TLabel")
Label01.pack(padx = 10,pady = 10)
Label02 = Label(root,text = "密码")
Label02.pack(padx = 10,pady = 10)
# 展示窗体
root.mainloop()

效果演示:

拓展

如果只想对某类中的某些控件生效,那么就必须要使用custom.Stylename格式来进行命名;

如我创建的style01的Stylename名称是username.TLabel,这里的username是自定义字段,那么后面的Label控件如果没有指定style是username.TLabel就不会具有style01的属性

from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("style属性")
root.geometry("300x200")

# 实例化一个style对象style01
style01 = Style()
# 对style01进行配置,Stylename属性设置为password.TLable
style01.configure("password.TLabel",font = ("华文黑体",18),background = "green",foreground = "blue")
# 把Label01控件绑定给style01对象
Label01 = Label(root,text = "用户名",style = "password.TLabel")
Label01.pack(padx = 10,pady = 10)
Label02 = Label(root,text = "密码")
Label02.pack(padx = 10,pady = 10)
# 展示窗体
root.mainloop()

这样控件的显示效果如下:

目的

这样就能使具体某一个组件生效,这样就能做到既能控制全局保持整体的统一,又能对具体某一类或者某一个特别对待,这种机制就很棒! ·

本文分享自微信公众号 - 小雨编程(xiaoxiaoyu1926),作者:小雨tt

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python GUI项目实战(四)实现学生明细窗体GUI设计

    在上一节实现主窗体信息查询功能中我们实现了在主窗体中通过单条件查询或者组合查询进行学生信息的筛选功能,系统能够在所有的数据中精确地找到某个具体的符合条件的学生信...

    小雨编程
  • 用Python写一个身份证号码校验系统

    本项目使用Tkinter作为GUI模块,充分利用Python面向对象的思想,开发一款实现身份证号码校验的应用程序。具备解析用户输入的身份证号码中的地区信息、出生...

    小雨编程
  • Python GUI项目实战(二)主窗体的界面设计与实现

    上一节我们介绍了登录窗体的GUI设计与功能实现,用户的账号和密码校验完成后应当跳转到主窗体内容,这一节我们将具体介绍主窗体界面的设计与功能实现!

    小雨编程
  • Kafka-7.设计

    Kafka设计的目的是为能作为一个统一的平台来处理大公司可能有的实时数据流。为此,需要考虑相当广泛的用例。

    悠扬前奏
  • 从URL开始,定位世界 | 洞见

    从我们输入URL并按下回车键到看到网页结果之间发生了什么?换句话说,一张网页,要经历怎样的过程,才能抵达用户面前?下面来从一些细节上面尝试一下探寻里面的秘密。 ...

    ThoughtWorks
  • 用Javascript获取页面元素的位置

    制作网页的过程中,你有时候需要知道某个元素在网页上的确切位置。 下面的教程总结了Javascript在网页定位方面的相关知识。 一、网页的大小和浏览器窗口的大小...

    ruanyf
  • 互联网广告活动中的主体问题研究

    主笔人:杨乐  彭宏洁   根据新《广告法》的界定,在互联网广告中,与传统广告形式一样也包括了广告主、广告经营者、广告发布者、广告代言人四类主体,但由于互联网广...

    腾讯研究院
  • 分享 10 道 Nodejs EventLoop 和事件相关面试题

    通过对以下 10 个面试题的分享,助您更好的理解 Node.js 的事件和 EventLoop 相关知识

    五月君
  • 图论碎碎念(2.3)

    Hello,狗子们大家好~(老大:小编你工资不想要了吗?)咳咳咳.... ...各位同学们大家好,今天的图论碎碎念来和大家聊一聊树。如何定义一棵树呢?

    艾木樨
  • 「自然语言处理(NLP)」---亚马逊QA(含源码) && 视觉问答QAA

    继续两篇文章分享,第一篇主要是卡耐基梅陇大学针对亚马逊平台上问题重复回答的痛点,提出了基于评论的QA模型任务,即利用先前对某一产品的问答,QA系统自动总...

    ShuYini

扫码关注云+社区

领取腾讯云代金券