• tkinter控件样式


    tkinter系列:

    以按钮为例

    tkinter对控件的诸多属性提供了可定制的功能,下面以最常用的按钮作为示例,集中展示其样式特点,而后再详细给出每种样式所支持的部件类型。

    在这里插入图片描述

    这里面并不涉及到诸如宽度width,高度height,以及调控与其他部件最小间隔的padx, pady,而只专注于能够体现“样式”的属性。

    其绘制代码如下,整体采用pack布局,每一组风格均放在一个Frame中,每个Frame都有一个Label和图像一一对应,然后所有Frame纵向排布下去。

    import tkinter as tk
    import tkinter.ttk as ttk
    
    root = tk.Tk()
    
    # 用于设置frame
    def setFrame(root, text):
        frm = tk.LabelFrame(root)
        frm.pack(side=tk.TOP, fill=tk.X, expand=tk.YES)
        ttk.Label(frm, text=text, width=10).pack(side=tk.LEFT)
        return frm
    
    pack = dict(side=tk.LEFT, padx=5)
    
    frm = setFrame(root, "按钮状态")
    status = {"禁用状态":tk.DISABLED, "普通状态":tk.NORMAL, "活跃状态":tk.ACTIVE}
    for i, key in enumerate(status, 2):
        tk.Button(frm, text=key, state=status[key]).pack(**pack)
    
    frm = setFrame(root, '按钮颜色')
    tk.Button(frm, text='背景色', bg='blue').pack(**pack)
    tk.Button(frm, text='前景色', fg='blue').pack(**pack)
    tk.Button(frm, text='鼠标点击改变背景', 
        activebackground='blue').pack(**pack)
    tk.Button(frm, text='鼠标点击改变前景', 
        activeforeground='blue').pack(**pack)
    
    frm = setFrame(root, '边框尺寸')
    for i in [1,3,5,7,9]:
        tk.Button(frm, text=f'边宽{i}', bd=i).pack(**pack)
    
    frm = setFrame(root, '按钮字体')
    fontDct = {'软体雅黑/12/重打印': ('软体雅黑', 10, 'overstrike'),
               '宋体/12/斜体'      : ('宋体', 10, 'italic'),
               '黑体/12/加粗'      : ('黑体', 10, 'bold'),
               '楷体/12/下划线'    : ('楷体', 10, 'underline')}
    for key in fontDct:
        tk.Button(frm, text=key, font=fontDct[key]).pack(**pack)
    
    frm = setFrame(root, '文字对齐')
    justDct = {'左对齐\n文字左侧对齐'  : tk.LEFT,
               '居中对齐\n文字居中对齐': tk.CENTER,
               '右对齐\n文字右侧对齐'  : tk.RIGHT}
    for key in justDct:
        tk.Button(frm, text=key, justify=justDct[key]).pack(**pack)
    
    frm = setFrame(root, '边框样式')
    reliefs = {'边框平坦' : tk.FLAT, '边框凹陷' : tk.SUNKEN, 
               '边框凸起' : tk.RAISED, '边框压线' : tk.GROOVE, 
               '边框脊线' : tk.RIDGE}
    for key in reliefs:
        tk.Button(frm, text=key, relief=reliefs[key]).pack(**pack)
    
    frm = setFrame(root, '文字样式')
    tk.Button(frm, text='文字换行显示', wraplength=30).pack(**pack)
    tk.Button(frm, text='文字下划线', underline=2).pack(**pack)
    tk.Button(frm, text='横向间距25', padx=25).pack(**pack)
    tk.Button(frm, text='纵向间距10', pady=10).pack(**pack)
    
    root.mainloop()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    共有参数

    下表给出了tkinter控件中常用的三种部件Label, Button, Entry所共有的的属性参数

    属性说明
    height高度
    wideth宽度
    bd边框宽度
    bg背景颜色
    fg前景颜色
    relief3D样式
    font文字字体
    justify文字对齐方式

    其中,relief可以选择tk.FLAT、tk.SUNKEN、tk.RAISED、tk.GROOVE、tk.RIDGE,每种3D样式可见上图。

    justify可选tk.LEFT, tk.CENTER, tk.RIGHT,对应左中右。

    font是一个元组,包括字体、字号以及字体样式三个内容,字体样式可以选择bold, italic, underline, overstrike这四种。

    此外,由于Entry中的文字是动态变化的,所以下面三个参数适用于Label和Button,但不适用于Entry

    属性说明
    text文字
    underline下划线
    wraplength文字行宽

    另一方面,Button和Entry都属于可操作控件,所以都有一个state参数,用以描述控件是否可操作,可选状态有tk.DISABLED、tk.NORMAL以及tk.ACTIVE。

    动态属性

    在一开始给出的Button参数图中,有鼠标点击改变背景和鼠标点击改变前景这两个按钮,它们对应的属性本质是一种封装好的事件。Button有这种被点击触发的事件;Entry则有选中文字后触发的事件,下面对这几种属性进行演示。

    在这里插入图片描述

    代码如下,注意用到了上面的setFrame函数。

    root = tk.Tk()
    
    frm = setFrame(root, '按钮颜色')
    tk.Button(frm, text='鼠标点击背景变红', 
        activebackground='red').pack(**pack)
    tk.Button(frm, text='鼠标点击文字变红', 
        activeforeground='red').pack(**pack)
    
    frm = setFrame(root, "Entry颜色")
    
    v1 = StringVar()
    v1.set('选中文字后底色为红色')
    tk.Entry(frm, textvariable=v1, selectbackground='red').pack(**pack)
    
    v2 = StringVar()
    v2.set('选中文字后文字为红色')
    tk.Entry(frm, textvariable=v2, selectforeground='red').pack(**pack)
    
    frm = setFrame(root, "Entry边框")
    
    v3 = StringVar()
    v3.set('选中文字后选取边框宽度')
    tk.Entry(frm, textvariable=v3, selectborderwidth=5).pack(**pack)
    
    v4 = StringVar()
    v4.set('聚焦后改变边框尺寸')
    tk.Entry(frm, textvariable=v4, highlightthickness=5).pack(**pack)
    
    root.mainloop()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    外贸出口游戏设备亚马逊CE认证电磁兼容性(EMC)测试解析
    聚观早报 | SpaceX 再获 2.5 亿美元融资;Meta推迟决定实习生转正
    解决uniapp修改内置组件样式,在微信中不生效问题
    ORB SLAM3 构建Frame
    Thread 类的基本用法
    SpringBoot初始化数据的一些方法
    初学phar反序列化
    值得反复研读的表连接之HASH JOIN方式
    C# 实现Ping远程主机功能
    【C/C++】uin8_t uint16_t uint32_t uint64_t数据类型解析
  • 原文地址:https://blog.csdn.net/m0_37816922/article/details/132239317