Python之tkinter 容器控件的基本应用

文章目录

框架Frame

  这是一个容器控件,当我们设计的GUI程序很复杂时,此时可以考虑将一系列相关的Widget控件组织在一个框架内,这样比较方便管理。构造方法语法如下:

# 父对象可以省略
Frame(父对象, options, ...)

参数:

  • 第一个参数:父对象,表示这个框架将建立在哪一个窗口内
  • 第二个参数:options,参数如下
参数 含义
borderwidth 边界宽度
默认是两个像素
bd 边界宽度
默认是两个像素
bg 背景颜色
background 背景颜色
cursor 当鼠标光标移至框架上时的形状
height 高,单位是字符高
highlightbackground 当框架没有获取焦点时的颜色
highlightcolor 当框架取得焦点时的颜色
highlighthickness 当框架取得焦点时的厚度
relief 可由此控制框架外框
默认是relief=FLAT
width 框架的宽度,单位是像素
省略时会自动调整为实际宽度

框架Frame的初步运用

例子:建立三个不同底色的框架

import tkinter

# 创建主窗口
root = tkinter.Tk()
for i in ["red", "orange", "lightgreen"]:
	# 这里省略了root
    tkinter.Frame(bg=i, height=50, width=150).pack()

root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用
框架也是一个Widget控件,所以最后也需要使用控件配置管理器包装与定位,也就是pack、grid等

例子:同时让鼠标光标在不同的框架上有不同的形状

import tkinter

# 创建主窗口
root = tkinter.Tk()
# 用字典存储框架颜色与光标形状
x = {"red": "cross", "orange": "boat", "lightgreen": "clock", "lightblue": "star"}

for i in x:
    # 建立四个不同底色的框架与光标形状
    tkinter.Frame(bg=i, cursor=x[i], height=50, width=150).pack(side=tkinter.LEFT)

root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用

在框架内创建Widget控件

  创建框架时会传回框架对象,假设此对象是A,以后在此框架内建立Widget控件时,此对象A就是框架内Widget控件的父容器,

A = Frame(root, ...)     # 传回框架对象A
button = Button(A, ...)  # 框架对象A是button功能按钮的父容器

例子

import tkinter

# 创建主窗口
root = tkinter.Tk()
# 建立上层框架
frameUp = tkinter.Frame(root, bg="lightyellow")
frameUp.pack()
# 上层框架第一个按钮
butOne = tkinter.Button(frameUp, text="One", fg="red")
butOne.pack(side=tkinter.LEFT, padx=5, pady=5)
# 上层框架第二个按钮
butTwo = tkinter.Button(frameUp, text="Two", fg="orange")
butTwo.pack(side=tkinter.LEFT, padx=5, pady=5)
# 上层框架第三个按钮
butThree = tkinter.Button(frameUp, text="Three", fg="lightgreen")
butThree.pack(side=tkinter.LEFT, padx=5, pady=5)
# 建立下层框架
frameLow = tkinter.Frame(root, bg="lightblue")
frameLow.pack()
# 建立下层框架的按钮
butLast = tkinter.Button(frameLow, text="Last")
butLast.pack(side=tkinter.LEFT, padx=5, pady=5)


root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用

活用relief 属性

可以利用 relie 属性的特性,将Widget 控件建立在框架内

例子

import tkinter

# 创建主窗口
root = tkinter.Tk()
frameOne = tkinter.Frame(width=150, height=80, relief=tkinter.GROOVE, borderwidth=5)
frameOne.pack(side=tkinter.LEFT, padx=5, pady=5)

frameTwo = tkinter.Frame(width=150, height=80, relief=tkinter.RAISED, borderwidth=5)
frameTwo.pack(side=tkinter.LEFT, padx=5, pady=5)

frameThree = tkinter.Frame(width=150, height=80, relief=tkinter.RIDGE, borderwidth=5)
frameThree.pack(side=tkinter.LEFT, padx=5, pady=5)

root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用

在含有raised属性的框架内创建复选框

例子

import tkinter

# 创建主窗口
root = tkinter.Tk()
frame = tkinter.Frame(width=150, height=80, relief=tkinter.RAISED, borderwidth=5)
frame.pack(padx=10, pady=10)
label = tkinter.Label(frame, text="选择你最喜欢的食物")
label.pack()
foodOne = tkinter.Checkbutton(frame, text="热干面")
foodOne.pack(anchor=tkinter.W)
foodTwo = tkinter.Checkbutton(frame, text="油条")
foodTwo.pack(anchor=tkinter.W)
foodThree = tkinter.Checkbutton(frame, text="面窝")
foodThree.pack(anchor=tkinter.W)

root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用

额外对relief属性的支持

在标准的Frame框架中,对于relief属性并没有完全支持。

例如,solidsunken属性,此时可以使用tkinter.ttkFrameStyle模块

例子

import tkinter
from tkinter.ttk import Frame, Style

# 创建主窗口
root = tkinter.Tk()
# 改用Style
style = Style()
# 改用alt支持Style
style.theme_use("alt")

fm1 = Frame(root, width=150, height=80, relief="flat")
fm1.grid(row=0, column=0, padx=5, pady=5)

fm2 = Frame(root, width=150, height=80, relief="groove")
fm2.grid(row=0, column=1, padx=5, pady=5)

fm3 = Frame(root, width=150, height=80, relief="raised")
fm3.grid(row=0, column=2, padx=5, pady=5)

fm4 = Frame(root, width=150, height=80, relief="ridge")
fm4.grid(row=1, column=0, padx=5, pady=5)

fm5 = Frame(root, width=150, height=80, relief="solid")
fm5.grid(row=1, column=1, padx=5, pady=5)

fm6 = Frame(root, width=150, height=80, relief="sunken")
fm6.grid(row=1, column=2, padx=5, pady=5)


root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用

上述程序中需使用tkinter.ttk模块内Frame的作为支持,才可正常显示relief外框。

alt参数主要是此机制内对于relief支持的参数

标签框架LabelFrame

标签框架的基本概念

  这也是一个容器控件,主要是将一系列相关Widget组织在一个标签框架内,然后给他一个名称,他的构造方法语法如下:

LabelFrame(父对象, options, ...)

参数:

  • 第一个参数:父对象,表示这个标签框架将建立在哪一个窗口内
  • 第二个参数:options,参数如下
参数 含义
borderwidth 边界宽度
默认是两个像素
bd 边界宽度
默认是两个像素
bg 背景颜色
background 背景颜色
cursor 当鼠标光标移至按钮上时的形状
font 标签框架中文字的字形
height 高,单位是字符高
highlightbackground 当框架没有获取焦点时的颜色
highlightcolor 当框架取得焦点时的颜色
highlighthickness 当框架取得焦点时的厚度
labelAnchor 设置放置标签的位置
relief 可由此控制框架外框
默认是relief=FLAT
text 标签内容
width 框架的宽度,单位是像素
省略时会自动调整为实际宽度

例子

import tkinter

# 创建主窗口
root = tkinter.Tk()
textFirst = "欢迎登录"
photo = tkinter.PhotoImage(file="1.png")
Logo = tkinter.Label(root, image=photo, text=textFirst, compound=tkinter.BOTTOM)
Logo.pack()

# LabelFrame标签框架
labelFrame = tkinter.LabelFrame(root, text="登录框")

accountLabel = tkinter.Label(labelFrame, text="账号")
accountLabel.grid(row=0, column=0)

accountEntry = tkinter.Entry(labelFrame)
accountEntry.grid(row=0, column=1)

passWd = tkinter.Label(labelFrame, text="密码")
passWd.grid(row=1, column=0)

passWdEntry = tkinter.Entry(labelFrame, show="*")
passWdEntry.grid(row=1, column=1)

labelFrame.pack(padx=10, pady=5, ipadx=5, ipady=5)

root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用

将标签框架用于复选框

  标签框架的应用范围很广泛,也常应用于将选项按钮或是复选框组织起来

例子

import tkinter

def send():
    x = ""
    for j in cheakboxs:
        # 这里实际上是cheakboxs[j].get() == True
        # 如果被勾选的话传回来的值为True
        # 如果没有被勾选的话传回来的值为False
        if cheakboxs[j].get():
            x = x +foods[j] + "\n"
    print(x)
# 创建主窗口
root = tkinter.Tk()

# LabelFrame标签框架
labelFrame = tkinter.LabelFrame(root, text="选择最喜欢的食物")
foods = {0: "饺子", 1: "春卷", 2: "汤圆", 3: "混沌", 4: "热干面"}
# 这里负责给予字典的键一个False或者True的值,用于检测是否被勾选
cheakboxs = {}
for i in range(len(foods)):
    # 这里相当于是{0: False, 1: False, 2: False, 3: False, 4: False}
    cheakboxs[i] = tkinter.BooleanVar()
    # 只有被勾选才变为True
    tkinter.Checkbutton(labelFrame, text=foods[i], variable=cheakboxs[i]).grid(row=i + 1, sticky=tkinter.W)

labelFrame.pack(padx=10, pady=5, ipadx=5, ipady=5)
button = tkinter.Button(root, text="提交", width=10, command=send)
button.pack()

root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用

顶层窗口 Toplevel

Toplevel 窗口的基本概念

  这个控件的功能类似于Frame,但是这个控件所产生的容器是一个独立的窗口,有自己的标题栏和边框。他的构造方法语法如下:

Toplevel(options, ...)

参数:

  • 第一个参数:options,参数如下
参数 含义
borderwidth 边界宽度
默认是两个像素
bd 边界宽度
默认是两个像素
bg 背景颜色
background 背景颜色
cursor 当鼠标光标在Toplevel 窗口上时的形状
font 字形
fg 文字前景颜色
height 窗口高度
width 窗口宽度
Toplevel 窗口的基础运行

例子

import tkinter

root = tkinter.Tk()

rootTwo = tkinter.Toplevel()
tkinter.Label(rootTwo, text="Python!!!").pack()
root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用
两个窗口出现后,Toplevel 窗口关闭后,原主窗口仍可以继续使用。但是如果关闭了主窗口,Toplevel 窗口将自动关闭

例子:设置Toplevel 窗口的标题和大小

import tkinter

root = tkinter.Tk()

rootTwo = tkinter.Toplevel()
rootTwo.title("Toplevel")
rootTwo.geometry("200x150")
tkinter.Label(rootTwo, text="Python!!!").pack()
root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用

使用按钮弹出Toplevel窗口

例子

import tkinter
import random


def show():
    num = random.randrange(1, 10)
    t1 = tkinter.Toplevel()
    t1.geometry("100x80")
    t1.title("Toplevel")
    # BOTH 上下左右居中
    # expand是否填充额外的父容器空间
    tkinter.Label(t1, text=num).pack(fill=tkinter.BOTH, expand=True)


root = tkinter.Tk()
button = tkinter.Button(root, text="请点击", command=show)
button.pack()

root.mainloop()

运行结果:
Python之tkinter 容器控件的基本应用

谢谢观看,笔者会持续更新,如有错误或者建议,请私信我

上一篇:使用python的tkinter模块实现的GUI版用户登录程序(附源码)


下一篇:Python tkinter是什么?GUI编程有哪些?