2-Tkinter 组件- 组件介绍和基础方法

组件介绍和基础方法

常用组件

Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用。这些控件通常被称为控件或者部件。

tkinter 类元素说明
Button按钮在程序中显示按钮
Canvas画布提供绘制功能
Checkbutton多选框在程序中显示多选框
Combobox下拉框显示下拉框
Entry输入框显示单行文本内容
Frame框架用于放置其他窗口部件
Label标签显示文本或位图
Listbox列表框显示选择列表
Menu菜单显示菜单栏
Message消息框类似与标签,可以显示多行文本
Radiobutton单选按钮显示单选按钮
Scale进度条线性滑块组件
Scrollbar滚动条显示一个滚动条
Text文本框显示多行文本
messagebox消息框弹出一个消息框

组件OPtions编辑技巧

通过设置OPtions设置组件的属性,从而控制组件的各种状态,如高宽文字字体、背景色等。

可通过以下三种方式设置OPtions组件的选项:

  • 创建对象时,使用命名参数(也叫关键字参数)
fred = Button(self, fg="red", bg="blue")
  • 创建对象后,使用字典索引值方式
fred = Button(self)
fred["fg"] = "red"
fred["bg"] = "blue"
  • 创建对象后使用config()方法
fred = Button(self)
fred.config(fg= "red", bg = "blue")

标准属性

标准属性也就是所有控件的共同属性,如大小,字体和颜色等等。

属性描述
Dimension控件大小
Color控件颜色
Font控件字体
Anchor锚点
Relief控件样式
Bitmap位图
Cursor光标移动到对应组件时的样式

常用窗口初始化方法

  • root.geometry("1785x950+100+100")设置窗口尺寸

  • root.resizable(False, False)不可调整大小

  • root.wm_attributes('-topmost', 1)窗口置顶

  • root.title("xxx") 设置标题

属性获取

以下部分获取宽高的方法需要先执行root.updata()方法,不然拿到的是默认值.

  • root.winfo_screenwidth()获取屏幕宽
  • root.winfo_screenheight()获取屏幕高度
  • root.winfo_height() # 返回此小部件的高度。
  • root.winfo_width() # 返回此小部件的宽度。
  • root.winfo_rootx # 返回该小部件左上角的x坐标 根窗口。
  • root.winfo_rooty # 返回该小部件左上角的y坐标 根窗口。
  • root.winfo_x() # 返回此小部件左上角的x坐标 相对父组件
  • root.winfo_y() # 返回此小部件左上角的y坐标 相对父组件
  • root.winfo_pointerx() # 返回根窗口上指针的x坐标。
  • root.winfo_pointery() # 返回根窗口上指针的y坐标
  • root.winfo_pointerxy() # 返回根窗口上指针的x和y坐标的元组。
  • root.winfo_cells() # 返回此小部件的colormap中的单元格数。
  • root.winfo_containing(rootX, rootY) # 返回位于根坐标ROOTX,ROOTY的小部件。
  • root.winfo_name() # 返回此小部件的名称。
  • root.winfo_exists() # 如果此小部件存在,则返回true。
  • root.winfo_ismapped() # 如果这个小部件被映射,则返回true。
  • root.winfo_depth() # 返回每个像素的位数。
  • root.winfo_manager() # 返回此小部件的窗口管理器名称。
  • root.winfo_parent() # 返回此小部件的父项的名称。
  • root.winfo_reqheight() # 返回此小部件的请求高度。
  • root.winfo_reqwidth() # 返回此小部件的请求宽度。
  • root.winfo_screen() # 返回此小部件的屏幕名称。
  • root.winfo_screendepth() # 返回此小部件屏幕的根窗口的每像素位数。
  • root.winfo_screenwidth() # 返回此小部件屏幕宽度的像素数,单位为像素。
  • root.winfo_screenheight() # 返回此小部件屏幕高度的像素数,单位为像素。
  • root.winfo_screencells() # 返回此小部件屏幕的颜色映射中的单元格数。
  • root.winfo_screenmmheight() # 返回此小部件屏幕高度的像素数,单位为mm。
  • root.winfo_screenmmwidth() # 返回此小部件屏幕宽度的像素数,单位为mm

设置窗口图标

  • iconbitmap() 将窗口图标设置为 bitmap。参数必须传入一个ico类型位图,不能为 png 或 jpg 等其他类型

  • iconphoto()可以实现将png格式的图像设置为窗口图标。

    window.iconphoto(False, tk.PhotoImage(file='头像.png'))第一参数False 表示该图标图像仅适用于该特定窗口,而不适用于将来创建的 toplevels 窗口;如果设置为True ,则图标图像也将应用于以后创建的所有 toplevels 图像。

  • tk.call() 方法是 tkinter 到 tcl 解释器的接口,可以用 call 方法运行 tcl 命令。

    需要将图像设置为 tk.PhotoImage 而不是图像本身,否则会出现 tkinter.TclError 错误。

    window.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(file='头像.png')) # 更改窗口图标

自定义关闭窗口事件

点击tkinter窗口程序的关闭按钮(X,一般在右上角),窗口会被关闭,这个过程实际上调用了窗口的destroy函数

下面介绍如何响应这个窗口关闭事件,不让tkinter系统自动调用destroy函数,而是调用一个自定义的函数,或者先运行一段自定义的代码,最后自己再调用destroy。

root = TK()

def close_callback():
    """
    do something
    """
    root.destroy()
  
root.protocol('WM_DELETE_WINDOW', close_callback)# 自定义回调方法
root.protocol('WM_DELETE_WINDOW', root.iconify)# 窗口最小化
root.protocol('WM_DELETE_WINDOW', root.destroy) # 直接关闭

批量创建组件说明

当批量创建组件时,如批量创建Button又全都绑定了方法时,会发现点击所有按钮效果都会是最后一个按钮的效果,此时需要将lambda 函数的写法改一下

command=lambda: show_color(c_text, single_color)只有一个按钮时没有问题,当批量创建就有问题.

command=lambda l_text=c_text, l_color=single_color: show_color(l_text, l_color)在lambda方法中声明参数,这样每个传递过去的参数都不一样

tkinter变量

tkinter中在多选框、单项框、Entry等组件中往往需要绑定一个独立的变量,这个变量需要绑定成tkinter专属变量。

定义

构造一个变量。

from tkinter import BooleanVar, StringVar, IntVar

tk_str = StringVar()
tk_Bol = BooleanVar()
tk_int = IntVar()

定义时参数

def __init__(self,
             master: Misc | None = ...,
             value: bool | None = ...,
             name: str | None = ...) -> None
  • master:可以作为master widget给出。
  • value:是可选值,BooleanVar默认为False,StringVar默认为"",IntVar默认为0
  • name:是可选的Tcl名称 (默认为PY_VARnum)。
    如果名称与现有变量匹配,并且值被省略 则保留现有值
设置值,更改值
# 设置值,常用于设置某些默认值
tk_str.set(value:str)
tk_Bol.set(value:bool)
tk_int.set(value:int)
获取值
tk_str.get()
tk_Bol.get()
tk_int.get()

cursor鼠标形状可选参数

在按钮等组件可以设置鼠标变形参数,设置cursor为以下相应参数即可.

在不同系统中样式可能会有出入,以下是win10中的默认鼠标样式时的显示样式。

属性效果属性效果
arrowimgpirateimg
circleimgplusimg
clockimgshuttleimg
crossimgsizingimg
dotboximgspiderimg
exchangeimgspraycanimg
fleurimgstarimg
hand2imgtarget[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCnon6xc-1688479515857)(https://gitcode.net/qq_40597070/pic_go/raw/master/202201061555952.webp)]
heartimgtcross[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-92812jU3-1688479515858)(https://gitcode.net/qq_40597070/pic_go/raw/master/202201061555900.webp)]
manimgtrekimg
mouseimgwatchimg

向组件件中插入图片

可以向TextLabelButton等小组件中插入图片展示。

Tkinter只支持gif等少数几个格式图像,可利用PIL.ImageTk.PhotoImage来获得更多图片支持。

推荐使用``PIL.ImageTk.PhotoImage`模块,支持更多图片不受格式限制,同时处理图像更方便。

原生 tkinter 写法
from tkinter import Label, Tk, PhotoImage


def show_image(image_path: str, show_label: Label):
    image = PhotoImage(file=image_path)  # 可设置宽高,大图是裁剪模式,width=600, height=600
    show_label.config(image=image)
    show_label.image = image


root = Tk()
root.geometry(f"200x200")

test_label = Label(root)
test_label.place(relx=0, rely=0, relwidth=1, relheight=1)
show_image("./png图.png", test_label)

root.mainloop()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKdFaAae-1688479515859)(C:\Users\Hi\AppData\Roaming\Typora\typora-user-images\image-20221206235047230.png)]

使用PIL.ImageTk.PhotoImage模块

pillow模块支持更多的图片格式,如jpg格式用用tkinter写法则会报错。

from tkinter import Label, Tk
from PIL.ImageTk import PhotoImage


def show_image(image_path: str, show_label: Label):
    image = PhotoImage(file=image_path)  # 可设置宽高,大图是裁剪模式,width=600, height=600
    show_label.config(image=image)
    show_label.image = image


root = Tk()
root.geometry(f"200x200")

test_label = Label(root)
test_label.place(relx=0, rely=0, relwidth=1, relheight=1)
show_image("./jpg图.jpg", test_label)

root.mainloop()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-roCIGkND-1688479515859)(C:\Users\Hi\AppData\Roaming\Typora\typora-user-images\image-20221206235128058.png)]

还可这么写在插入图片前对图像进行处理,如下例子在插入图片前进行了缩放操作。

from tkinter import Label, Tk
from PIL import ImageTk, Image


def show_image(image_path, show_label):
    pil_image = Image.open(image_path)
    resize_image = pil_image.resize(size=(200, 200))  # 缩放
    image = ImageTk.PhotoImage(image=resize_image)
    show_label.config(image=image)
    show_label.image = image


root = Tk()
root.geometry(f"200x200")

test_label = Label(root)
test_label.place(relx=0, rely=0, relwidth=1, relheight=1)

show_image("./jpg图.jpg", test_label)

root.mainloop()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8arZxoAU-1688479515860)(C:\Users\Hi\AppData\Roaming\Typora\typora-user-images\image-20221206234943646.png)]

插入图片不显示问题

由于python的垃圾回收机制,Python 通过垃圾收集的过程自动删除对变量的引用,导致在方法重定义图片就会导致图像无法正常显示。解决方案是保存参考或创建新参考

如下所示,本应该在点击按钮时显示图片的,但是实际点击并不显示。这个就是由于python垃圾回收机导致。

from tkinter import Tk
from tkinter.ttk import Label, Button
from PIL import Image, ImageTk


class demo:
    def __init__(self, win):
        self.root = win
        self.gui_init()

    def gui_init(self):
        show_image = Label(self.root, relief="solid")
        show_but = Button(self.root, text="展示图片", command=lambda: self.updata_image(show_image))

        show_but.place(relx=0.33, rely=0.01, relwidth=0.33, relheight=0.08)
        show_image.place(relx=0.01, rely=0.1, relwidth=0.98, relheight=0.9)

    def updata_image(self, show_area: Label):
        image = ImageTk.PhotoImage(image=Image.open("./png图.png"))
        show_area.config(image=image)
        

if __name__ == '__main__':
    root = Tk()
    root.geometry("300x300")
    demo(root)
    root.mainloop()

基于以上问题提出三种解决办法,推荐前两种。

加全局声明

给图片变量先坐一个全局声明这样就不会在后面被垃圾机制删除

from tkinter import Tk
from tkinter.ttk import Label, Button
from PIL import Image, ImageTk

global image


class demo:
    def __init__(self, win):
        self.root = win
        self.gui_init()

    def gui_init(self):
        show_image = Label(self.root, relief="solid")
        show_but = Button(self.root, text="展示图片", command=lambda: demo.updata_image(show_image))

        show_but.place(relx=0.33, rely=0.01, relwidth=0.33, relheight=0.08)
        show_image.place(relx=0.01, rely=0.1, relwidth=0.98, relheight=0.9)

    @staticmethod
    def updata_image(show_area: Label):
        global image
        image = ImageTk.PhotoImage(image=Image.open("./png图.png"))
        show_area.config(image=image)


if __name__ == '__main__':
    root = Tk()
    root.geometry("300x300")
    demo(root)
    root.mainloop()

在类中定义类变量
from tkinter import Tk
from tkinter.ttk import Label, Button
from PIL import Image, ImageTk


class demo:
    def __init__(self, win):
        self.root = win
        self.gui_init()
        self.pil_image = None

    def gui_init(self):
        show_image = Label(self.root, relief="solid")
        show_but = Button(self.root, text="展示图片", command=lambda: self.updata_image(show_image))

        show_but.place(relx=0.33, rely=0.01, relwidth=0.33, relheight=0.08)
        show_image.place(relx=0.01, rely=0.1, relwidth=0.98, relheight=0.9)

    def updata_image(self, show_area: Label):
        self.pil_image = ImageTk.PhotoImage(image=Image.open("./png图.png"))
        show_area.config(image=self.pil_image)


if __name__ == '__main__':
    root = Tk()
    root.geometry("300x300")
    demo(root)
    root.mainloop()

强制给显示区域赋值

如下所有在方法中重新设置Label的image参数后,补充一句show_area.image = image

这种方式在pycharm中会发出黄色警告提示,但运行正常。

from tkinter import Tk
from tkinter.ttk import Label, Button
from PIL import Image, ImageTk


class demo:
    def __init__(self, win):
        self.root = win
        self.gui_init()

    def gui_init(self):
        show_image = Label(self.root, relief="solid")
        show_but = Button(self.root, text="展示图片", command=lambda: demo.updata_image(show_image))

        show_but.place(relx=0.33, rely=0.01, relwidth=0.33, relheight=0.08)
        show_image.place(relx=0.01, rely=0.1, relwidth=0.98, relheight=0.9)

    @staticmethod
    def updata_image(show_area: Label):
        pil_image = ImageTk.PhotoImage(image=Image.open("./png图.png"))
        show_area.config(image=pil_image)
        show_area.image = pil_image


if __name__ == '__main__':
    root = Tk()
    root.geometry("300x300")
    demo(root)
    root.mainloop()

tkinter中的颜色

image-20220101215803978

[['#FFB6C1 LightPink 浅粉红', ['#FFB6C1', 'LightPink', '浅粉红']],
['#FFC0CB Pink 粉红', ['#FFC0CB', 'Pink', '粉红']],
['#DC143C Crimson 深红/猩红', ['#DC143C', 'Crimson', '深红/猩红']],
['#FFF0F5 LavenderBlush 淡紫红', ['#FFF0F5', 'LavenderBlush', '淡紫红']],
['#DB7093 PaleVioletRed 弱紫罗兰红', ['#DB7093', 'PaleVioletRed', '弱紫罗兰红']],
['#FF69B4 HotPink 热情的粉红', ['#FF69B4', 'HotPink', '热情的粉红']],
['#FF1493 DeepPink 深粉红', ['#FF1493', 'DeepPink', '深粉红']],
['#C71585 MediumVioletRed 中紫罗兰红', ['#C71585', 'MediumVioletRed', '中紫罗兰红']],
['#DA70D6 Orchid 暗紫色/兰花紫', ['#DA70D6', 'Orchid', '暗紫色/兰花紫']],
['#D8BFD8 Thistle 蓟色', ['#D8BFD8', 'Thistle', '蓟色']],
['#DDA0DD Plum 洋李色/李子紫', ['#DDA0DD', 'Plum', '洋李色/李子紫']],
['#EE82EE Violet 紫罗兰', ['#EE82EE', 'Violet', '紫罗兰']],
['#FF00FF Magenta 洋红/玫瑰红', ['#FF00FF', 'Magenta', '洋红/玫瑰红']],
['#FF00FF Fuchsia 紫红/灯笼海棠', ['#FF00FF', 'Fuchsia', '紫红/灯笼海棠']],
['#8B008B DarkMagenta 深洋红', ['#8B008B', 'DarkMagenta', '深洋红']],
['#800080 Purple 紫色', ['#800080', 'Purple', '紫色']],
['#BA55D3 MediumOrchid 中兰花紫', ['#BA55D3', 'MediumOrchid', '中兰花紫']],
['#9400D3 DarkViolet 暗紫罗兰', ['#9400D3', 'DarkViolet', '暗紫罗兰']],
['#9932CC DarkOrchid 暗兰花紫', ['#9932CC', 'DarkOrchid', '暗兰花紫']],
['#4B0082 Indigo 靛青/紫兰色', ['#4B0082', 'Indigo', '靛青/紫兰色']],
['#8A2BE2 BlueViolet 蓝紫罗兰', ['#8A2BE2', 'BlueViolet', '蓝紫罗兰']],
['#9370DB MediumPurple 中紫色', ['#9370DB', 'MediumPurple', '中紫色']],
['#7B68EE MediumSlateBlue 中暗蓝色/中板岩蓝', ['#7B68EE', 'MediumSlateBlue', '中暗蓝色/中板岩蓝']],
['#6A5ACD SlateBlue 石蓝色/板岩蓝', ['#6A5ACD', 'SlateBlue', '石蓝色/板岩蓝']],
['#483D8B DarkSlateBlue 暗灰蓝色/暗板岩蓝', ['#483D8B', 'DarkSlateBlue', '暗灰蓝色/暗板岩蓝']],
['#E6E6FA Lavender 淡紫色/熏衣草淡紫', ['#E6E6FA', 'Lavender', '淡紫色/熏衣草淡紫']],
['#F8F8FF GhostWhite 幽灵白', ['#F8F8FF', 'GhostWhite', '幽灵白']],
['#0000FF Blue 纯蓝', ['#0000FF', 'Blue', '纯蓝']],
['#0000CD MediumBlue 中蓝色', ['#0000CD', 'MediumBlue', '中蓝色']],
['#191970 MidnightBlue 午夜蓝', ['#191970', 'MidnightBlue', '午夜蓝']],
['#00008B DarkBlue 暗蓝色', ['#00008B', 'DarkBlue', '暗蓝色']],
['#000080 Navy 海军蓝', ['#000080', 'Navy', '海军蓝']],
['#4169E1 RoyalBlue 皇家蓝/宝蓝', ['#4169E1', 'RoyalBlue', '皇家蓝/宝蓝']],
['#6495ED CornflowerBlue 矢车菊蓝', ['#6495ED', 'CornflowerBlue', '矢车菊蓝']],
['#B0C4DE LightSteelBlue 亮钢蓝', ['#B0C4DE', 'LightSteelBlue', '亮钢蓝']],
['#778899 LightSlateGray 亮蓝灰/亮石板灰', ['#778899', 'LightSlateGray', '亮蓝灰/亮石板灰']],
['#708090 SlateGray 灰石色/石板灰', ['#708090', 'SlateGray', '灰石色/石板灰']],
['#1E90FF DodgerBlue 闪兰色/道奇蓝', ['#1E90FF', 'DodgerBlue', '闪兰色/道奇蓝']],
['#F0F8FF AliceBlue 爱丽丝蓝', ['#F0F8FF', 'AliceBlue', '爱丽丝蓝']],
['#4682B4 SteelBlue 钢蓝/铁青', ['#4682B4', 'SteelBlue', '钢蓝/铁青']],
['#87CEFA LightSkyBlue 亮天蓝色', ['#87CEFA', 'LightSkyBlue', '亮天蓝色']],
['#87CEEB SkyBlue 天蓝色', ['#87CEEB', 'SkyBlue', '天蓝色']],
['#00BFFF DeepSkyBlue 深天蓝', ['#00BFFF', 'DeepSkyBlue', '深天蓝']],
['#ADD8E6 LightBlue 亮蓝', ['#ADD8E6', 'LightBlue', '亮蓝']],
['#B0E0E6 PowderBlue 粉蓝色/火药青', ['#B0E0E6', 'PowderBlue', '粉蓝色/火药青']],
['#5F9EA0 CadetBlue 军兰色/军服蓝', ['#5F9EA0', 'CadetBlue', '军兰色/军服蓝']],
['#F0FFFF Azure 蔚蓝色', ['#F0FFFF', 'Azure', '蔚蓝色']],
['#E0FFFF LightCyan 淡青色', ['#E0FFFF', 'LightCyan', '淡青色']],
['#AFEEEE PaleTurquoise 弱绿宝石', ['#AFEEEE', 'PaleTurquoise', '弱绿宝石']],
['#00FFFF Cyan 青色', ['#00FFFF', 'Cyan', '青色']],
['#00FFFF Aqua 浅绿色/水色', ['#00FFFF', 'Aqua', '浅绿色/水色']],
['#00CED1 DarkTurquoise 暗绿宝石', ['#00CED1', 'DarkTurquoise', '暗绿宝石']],
['#2F4F4F DarkSlateGray 暗瓦灰色/暗石板灰', ['#2F4F4F', 'DarkSlateGray', '暗瓦灰色/暗石板灰']],
['#008B8B DarkCyan 暗青色', ['#008B8B', 'DarkCyan', '暗青色']],
['#008080 Teal 水鸭色', ['#008080', 'Teal', '水鸭色']],
['#48D1CC MediumTurquoise 中绿宝石', ['#48D1CC', 'MediumTurquoise', '中绿宝石']],
['#20B2AA LightSeaGreen 浅海洋绿', ['#20B2AA', 'LightSeaGreen', '浅海洋绿']],
['#40E0D0 Turquoise 绿宝石', ['#40E0D0', 'Turquoise', '绿宝石']],
['#7FFFD4 Aquamarine 宝石碧绿', ['#7FFFD4', 'Aquamarine', '宝石碧绿']],
['#66CDAA MediumAquamarine 中宝石碧绿', ['#66CDAA', 'MediumAquamarine', '中宝石碧绿']],
['#00FA9A MediumSpringGreen 中春绿色', ['#00FA9A', 'MediumSpringGreen', '中春绿色']],
['#F5FFFA MintCream 薄荷奶油', ['#F5FFFA', 'MintCream', '薄荷奶油']],
['#00FF7F SpringGreen 春绿色', ['#00FF7F', 'SpringGreen', '春绿色']],
['#3CB371 MediumSeaGreen 中海洋绿', ['#3CB371', 'MediumSeaGreen', '中海洋绿']],
['#2E8B57 SeaGreen 海洋绿', ['#2E8B57', 'SeaGreen', '海洋绿']],
['#F0FFF0 Honeydew 蜜色/蜜瓜色', ['#F0FFF0', 'Honeydew', '蜜色/蜜瓜色']],
['#90EE90 LightGreen 淡绿色', ['#90EE90', 'LightGreen', '淡绿色']],
['#98FB98 PaleGreen 弱绿色', ['#98FB98', 'PaleGreen', '弱绿色']],
['#8FBC8F DarkSeaGreen 暗海洋绿', ['#8FBC8F', 'DarkSeaGreen', '暗海洋绿']],
['#32CD32 LimeGreen 闪光深绿', ['#32CD32', 'LimeGreen', '闪光深绿']],
['#00FF00 Lime 闪光绿', ['#00FF00', 'Lime', '闪光绿']],
['#228B22 ForestGreen 森林绿', ['#228B22', 'ForestGreen', '森林绿']],
['#008000 Green 纯绿', ['#008000', 'Green', '纯绿']],
['#006400 DarkGreen 暗绿色', ['#006400', 'DarkGreen', '暗绿色']],
['#7FFF00 Chartreuse 黄绿色/查特酒绿', ['#7FFF00', 'Chartreuse', '黄绿色/查特酒绿']],
['#7CFC00 LawnGreen 草绿色/草坪绿', ['#7CFC00', 'LawnGreen', '草绿色/草坪绿']],
['#ADFF2F GreenYellow 绿黄色', ['#ADFF2F', 'GreenYellow', '绿黄色']],
['#556B2F DarkOliveGreen 暗橄榄绿', ['#556B2F', 'DarkOliveGreen', '暗橄榄绿']],
['#9ACD32 YellowGreen 黄绿色', ['#9ACD32', 'YellowGreen', '黄绿色']],
['#6B8E23 OliveDrab 橄榄褐色', ['#6B8E23', 'OliveDrab', '橄榄褐色']],
['#F5F5DC Beige 米色/灰棕色', ['#F5F5DC', 'Beige', '米色/灰棕色']],
['#FAFAD2 LightGoldenrodYellow 亮菊黄', ['#FAFAD2', 'LightGoldenrodYellow', '亮菊黄']],
['#FFFFF0 Ivory 象牙色', ['#FFFFF0', 'Ivory', '象牙色']],
['#FFFFE0 LightYellow 浅黄色', ['#FFFFE0', 'LightYellow', '浅黄色']],
['#FFFF00 Yellow 纯黄', ['#FFFF00', 'Yellow', '纯黄']],
['#808000 Olive 橄榄', ['#808000', 'Olive', '橄榄']],
['#BDB76B DarkKhaki 暗黄褐色/深卡叽布', ['#BDB76B', 'DarkKhaki', '暗黄褐色/深卡叽布']],
['#FFFACD LemonChiffon 柠檬绸', ['#FFFACD', 'LemonChiffon', '柠檬绸']],
['#EEE8AA PaleGoldenrod 灰菊黄/苍麒麟色', ['#EEE8AA', 'PaleGoldenrod', '灰菊黄/苍麒麟色']],
['#F0E68C Khaki 黄褐色/卡叽布', ['#F0E68C', 'Khaki', '黄褐色/卡叽布']],
['#FFD700 Gold 金色', ['#FFD700', 'Gold', '金色']],
['#FFF8DC Cornsilk 玉米丝色', ['#FFF8DC', 'Cornsilk', '玉米丝色']],
['#DAA520 Goldenrod 金菊黄', ['#DAA520', 'Goldenrod', '金菊黄']],
['#B8860B DarkGoldenrod 暗金菊黄', ['#B8860B', 'DarkGoldenrod', '暗金菊黄']],
['#FFFAF0 FloralWhite 花的白色', ['#FFFAF0', 'FloralWhite', '花的白色']],
['#FDF5E6 OldLace 老花色/旧蕾丝', ['#FDF5E6', 'OldLace', '老花色/旧蕾丝']],
['#F5DEB3 Wheat 浅黄色/小麦色', ['#F5DEB3', 'Wheat', '浅黄色/小麦色']],
['#FFE4B5 Moccasin 鹿皮色/鹿皮靴', ['#FFE4B5', 'Moccasin', '鹿皮色/鹿皮靴']],
['#FFA500 Orange 橙色', ['#FFA500', 'Orange', '橙色']],
['#FFEFD5 PapayaWhip 番木色/番木瓜', ['#FFEFD5', 'PapayaWhip', '番木色/番木瓜']],
['#FFEBCD BlanchedAlmond 白杏色', ['#FFEBCD', 'BlanchedAlmond', '白杏色']],
['#FFDEAD NavajoWhite 纳瓦白/土著白', ['#FFDEAD', 'NavajoWhite', '纳瓦白/土著白']],
['#FAEBD7 AntiqueWhite 古董白', ['#FAEBD7', 'AntiqueWhite', '古董白']],
['#D2B48C Tan 茶色', ['#D2B48C', 'Tan', '茶色']],
['#DEB887 BurlyWood 硬木色', ['#DEB887', 'BurlyWood', '硬木色']],
['#FFE4C4 Bisque 陶坯黄', ['#FFE4C4', 'Bisque', '陶坯黄']],
['#FF8C00 DarkOrange 深橙色', ['#FF8C00', 'DarkOrange', '深橙色']],
['#FAF0E6 Linen 亚麻布', ['#FAF0E6', 'Linen', '亚麻布']],
['#CD853F Peru 秘鲁色', ['#CD853F', 'Peru', '秘鲁色']],
['#FFDAB9 PeachPuff 桃肉色', ['#FFDAB9', 'PeachPuff', '桃肉色']],
['#F4A460 SandyBrown 沙棕色', ['#F4A460', 'SandyBrown', '沙棕色']],
['#D2691E Chocolate 巧克力色', ['#D2691E', 'Chocolate', '巧克力色']],
['#8B4513 SaddleBrown 重褐色/马鞍棕色', ['#8B4513', 'SaddleBrown', '重褐色/马鞍棕色']],
['#FFF5EE Seashell 海贝壳', ['#FFF5EE', 'Seashell', '海贝壳']],
['#A0522D Sienna 黄土赭色', ['#A0522D', 'Sienna', '黄土赭色']],
['#FFA07A LightSalmon 浅鲑鱼肉色', ['#FFA07A', 'LightSalmon', '浅鲑鱼肉色']],
['#FF7F50 Coral 珊瑚', ['#FF7F50', 'Coral', '珊瑚']],
['#FF4500 OrangeRed 橙红色', ['#FF4500', 'OrangeRed', '橙红色']],
['#E9967A DarkSalmon 深鲜肉/鲑鱼色', ['#E9967A', 'DarkSalmon', '深鲜肉/鲑鱼色']],
['#FF6347 Tomato 番茄红', ['#FF6347', 'Tomato', '番茄红']],
['#FFE4E1 MistyRose 浅玫瑰色/薄雾玫瑰', ['#FFE4E1', 'MistyRose', '浅玫瑰色/薄雾玫瑰']],
['#FA8072 Salmon 鲜肉/鲑鱼色', ['#FA8072', 'Salmon', '鲜肉/鲑鱼色']],
['#FFFAFA Snow 雪白色', ['#FFFAFA', 'Snow', '雪白色']],
['#F08080 LightCoral 淡珊瑚色', ['#F08080', 'LightCoral', '淡珊瑚色']],
['#BC8F8F RosyBrown 玫瑰棕色', ['#BC8F8F', 'RosyBrown', '玫瑰棕色']],
['#CD5C5C IndianRed 印度红', ['#CD5C5C', 'IndianRed', '印度红']],
['#FF0000 Red 纯红', ['#FF0000', 'Red', '纯红']],
['#A52A2A Brown 棕色', ['#A52A2A', 'Brown', '棕色']],
['#B22222 FireBrick 火砖色/耐火砖', ['#B22222', 'FireBrick', '火砖色/耐火砖']],
['#8B0000 DarkRed 深红色', ['#8B0000', 'DarkRed', '深红色']],
['#800000 Maroon 栗色', ['#800000', 'Maroon', '栗色']],
['#FFFFFF White 纯白', ['#FFFFFF', 'White', '纯白']],
['#F5F5F5 WhiteSmoke 白烟', ['#F5F5F5', 'WhiteSmoke', '白烟']],
['#DCDCDC Gainsboro 淡灰色', ['#DCDCDC', 'Gainsboro', '淡灰色']],
['#D3D3D3 LightGrey 浅灰色', ['#D3D3D3', 'LightGrey', '浅灰色']],
['#C0C0C0 Silver 银灰色', ['#C0C0C0', 'Silver', '银灰色']],
['#A9A9A9 DarkGray 深灰色', ['#A9A9A9', 'DarkGray', '深灰色']],
['#808080 Gray 灰色', ['#808080', 'Gray', '灰色']],
['#696969 DimGray 暗淡灰', ['#696969', 'DimGray', '暗淡灰']],
['#000000 Black 纯黑', ['#000000', 'Black', '纯黑']]]

Tk主题样式设置

关于主题样式设置在下面ttk介绍中有更详细的用法介绍。

from tkinter.ttk import *

该代码导致几个tkinter.ttk小部件(Button, Checkbutton,Entry,Frame,Label, LabelFrame,Menubutton,PanedWindow, Radiobutton,Scale和Scrollbar)自动替换Tk小部件。
因为Ttk小部件不再存在诸如:“fg”,"bg"等小部件以及其它相关的小部件样式,所以我们只能使用ttk.Style类来改进样式效果。

Ttk小部件

Ttk附带17个小部件,其中11个已经存在于tkinter: Button,Checkbutton,Entry,Frame, Label,LabelFrame,Menubutton,PanedWindow, Radiobutton,Scale和Scrollbar。其他六个是新的:Combobox,Notebook,Progressbar, Separator,Sizegrip和Treeview。而且它们都是Widget的子类。

Tk代码:

l1 = tkinter.Label(text="Test", fg="black", bg="white")
l2 = tkinter.Label(text="Test", fg="black", bg="white")

Ttk代码:

style = ttk.Style()
style.configure("BW.TLabel", foreground="black", background="white")
l1 = ttk.Label(text="Test", style="BW.TLabel")
l2 = ttk.Label(text="Test", style="BW.TLabel")
小工具

ttk.Widget定义了Tk主题小部件支持的标准选项和方法,不应该直接实例化。

选项描述
class[类] 指定窗口类。在查询选项数据库中窗口的其他选项时,使用该类,确定窗口的默认绑定标签,以及选择窗口小部件的默认布局和样式。此选项是只读的,只能在创建窗口时指定。
cursor[光标] 指定要用于窗口小部件的鼠标光标。如果设置为空字符串(默认值),则为父窗口小部件继承游标。
takefocus确定窗口是否在键盘遍历期间接受焦点。返回0,1或空字符串。如果返回0,则表示在键盘遍历期间应完全跳过该窗口。如果为1,则表示只要可以查看窗口就应该接收输入焦点。空字符串表示遍历脚本决定是否关注窗口。
style[样式] 可用于指定自定义窗口小部件样式 。
可滚动窗口小部件选项

由滚动条控制的窗口小部件支持以下选项。

选项描述
xscrollcommand用于与水平滚动条进行通信。当窗口小部件窗口中的视图发生更改时,窗口小部件将基于scroll命令生成Tcl命令。通常,此选项包含某些滚动条的Scrollbar.set()方法 。这将导致只要窗口中的视图发生更改,就会更新滚动条。
yscrollcommand用于与垂直滚动条进行通信。有关更多信息,请参见上文。
label选项
选项描述
text[文本] 指定要在窗口小部件中显示的文本字符串。
textvariable指定将使用其值代替文本选项资源的名称。
underline[下划线] 如果设置,则指定要在文本字符串中加下划线的字符的索引(从0开始)。下划线字符用于助记符激活。
image[图片] 指定要显示的图像。这是一个或多个元素的列表。第一个元素是默认图像名称。列表的其余部分,如果由Style.map()定义的一系列statepec / value对,指定在窗口小部件处于特定状态或状态组合时要使用的不同图像。列表中的所有图像应具有相同的大小。
compound[复合]指定在存在文本和图像选项的情况下如何显示相对于文本的图像。有效值为: text:仅显示文字 image:仅显示图像 top, bottom, left, right: :分别显示文本上方,下方,左侧或右侧的图像。none:默认值。显示图像(如果存在),否则显示文本。
width[宽度]如果大于零,则指定为文本标签分配多少空格(字符宽度),如果小于零,则指定最小宽度。
兼容性选项

state 可以设置为“正常”或“禁用”以控制“禁用”状态位。这是一个只写选项:设置它会更改窗口小部件状态,但Widget.state()方法不会影响此选项。

state设置按钮组件状态,可选的有NORMAL(普通)、ACTIVE(活跃)、 DISABLED(禁用)。默认 NORMAL。

小部件可设置state

flag描述
active鼠标光标位于窗口小部件上,按下鼠标按钮将导致某些操作发生
disabled在程序控制下禁用小组件
focus小工具有键盘焦点
pressed小工具被按下了
selected“On”,“true”或“current”类似于Checkbuttons和radiobutton的设置一样
backgroundWindows和Mac具有“活动”或前景窗口的概念。该背景状态设置为背景的窗口小部件,并清除了那些在前台窗口
readonly小部件不应允许用户修改
alternate特定于小部件的备用显示格式
invalid小部件值无效
ttk.Widget

除了下面描述的方法之外,ttk.Widget还支持方法tkinter.Widget.cget()和tkinter.Widget.configure()。

statespec通常是列表或元组。

class tkinter.ttk.Widget
  identify(x, y)
   返回位置x y处元素的名称,如果该点不位于任何元素内,则返回空字符串。
   x和y是相对于小部件的像素坐标。
  instate(statespec, callback=None, *args, **kw)
	  测试小部件的状态。如果没有指定一个回调,返回真如果控件状态匹配statespec和假否则。
	  如果指定了回调,那么如果widget状态与statespec匹配,则使用args调用它 。
  state(statespec=None)
	 修改或查询小部件状态。如果指定了statespec,则根据它设置窗口小部件状态并返回指示哪些标志
	 已更改的新状态规范。如果未指定statespec,则返回当前启用的状态标志。

Combobox

该ttk.Combobox控件结合了文本字段值的弹出的下拉列表。此小部件是Entry的子类。

除了从Widget继承的方法:Widget.cget(), Widget.configure(),Widget.identify(),Widget.instate() 和Widget.state(),以及继承自Entry: Entry.bbox()的以下方法,Entry.delete(),Entry.icursor(), Entry.index(),Entry.inset(),Entry.selection(), Entry.xview(),它有一些其他方法,在ttk.Combobox中描述 。

此小部件接受以下特定选项:

选项描述
exportselection布尔值。如果设置,则窗口小部件选择链接到窗口管理器选择(例如,可以通过调用Misc.selection_get返回)。
justify指定文本在窗口小部件中的对齐方式。“left”,“center”或“right”之一。
height以行为单位指定弹出列表框的高度。
postcommand在显示值之前立即调用的脚本(可能已在Misc.register中注册)。它可以指定要显示的值。
state"normal”,“readnoly”或“disabled”之一。在“readonly”状态下,可能无法直接编辑该值,并且用户只能从下拉列表中选择值。在“normal”状态下,文本字段可直接编辑。在“disabled”状态下,不可能进行交互。
textvariable指定其值链接到窗口小部件值的名称。只要与该名称关联的值发生更改,窗口小部件值就会更新,反之亦然。请参阅tkinter.StringVar。
values指定要在下拉列表框中显示的值列表
width指定一个整数值,指示输入窗口的所需宽度,以小部件字体的平均大小字符表示。
虚拟事件

当用户从值中选择元素时,组合框小部件生成<>虚拟事件

设置字体

直接设置

大部分可设置字体组件的都有个font参数

  • 字体: 字体名字 (如‘宋体’、‘楷体’、‘仿宋’等)
  • 字号:数字 如:12 14 16 24等
  • 粗体:bold
  • 斜体:italic
  • 下划线:underline
  • 删除线:overstrike

可直接在字体处如下写法

from tkinter import *
from tkinter.ttk import *

root = Tk()
root.geometry("200x100")

label = Label(root, text="测试字体", font=("宋体", 22, "bold", "italic", "underline", "overstrike"))

label.pack(fill="both", expand=1)

root.mainloop()

image-20221219203608063

# 改变组件的显示字体
# 在Windows上测试字体显示,注意字体中包含有空格的字体名称必须指定为tuple类型。
from tkinter import *

root = Tk()
# 创建一个Label
for ft in ('Arial',
           ('Courier New',),
           ('Comic Sans MS',),
           'Fixdsys',
           ('MS Sans Serif',),
           ('MS Serif',),
           'Symbol',
           'System',
           ('Times New Roman',),
           'Verdana'):
    Label(root, text='hello sticky', font=ft).grid()

root.mainloop()

image-20221219211216372

通过Font设置字体

通过导入font模块设置import tkinter.font

tkinter.font.Font def __init__(self,
                               root: Misc | None = ...,
                               font: str | Font | list | Tuple[Any, ...] | Tcl_Obj | None = ...,
                               name: str | None = ...,
                               exists: bool = ...,
                               *,
                               family: str = ...,
                               size: int = ...,
                               weight: Literal["normal", "bold"] = ...,
                               slant: Literal["roman", "italic"] = ...,
                               underline: bool = ...,
                               overstrike: bool = ...) -> None

  • family:字体名,“黑体”, “宋体”, “楷体”, "微软雅黑"等, “幼圆” 系统特定字体’ansi’, ‘ansifixed’, ‘device’, ‘oemfixed’, ‘system’, ‘systemfixed’
  • size:字号
  • weight:加粗,可选"normal"/“bold”(加粗),默认"normal"
  • slant:斜体,可选"roman",/“italic”(斜体),默认roman
  • underline:下划线,布尔值
  • overstrike:删除线,布尔值
# 使用系统已有的字体,使用tkFont.Font来创建字体。

from tkinter import *
# 引入字体模块
from tkinter.font import Font, BOLD, ITALIC

root = Tk()
# 创建一个Label
# 指定字体名称、大小、样式
for ft_family in ["黑体", "宋体", "楷体", "微软雅黑", "幼圆"]:# 系统特定字体'ansi', 'ansifixed', 'device', 'oemfixed', 'system', 'systemfixed'
    ft = Font(family=ft_family,  # 字体如黑体、宋体、楷体、微软雅黑
              size=20,  # 字号
              weight=BOLD,  # 字体加粗Literal["normal", "bold"]
              # slant=ITALIC,  # 斜体Literal["roman", "italic"]
              # underline=True,  # 下划线
              # overstrike=True  # 删除线
              )
    Label(root, text=ft_family, font=ft).pack()

root.mainloop()
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

士别三日,当挖目相待

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

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

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

打赏作者

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

抵扣说明:

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

余额充值