python : Tkinter布局

Frame

from tkinter import *
root = Tk()

# 定义第一个容器
frame_left=Frame(root,bg="green")
frame_left.place(relx=0.2,rely=0.2,relwidth=0.3,relheight=0.6)

label_1=Label(frame_left,text="富强")
label_1.place(relx=0.2,rely=0.2)
label_2=Label(frame_left,text="民主")
label_2.place(relx=0.6,rely=0.2)
label_3=Label(frame_left,text="文明")
label_3.place(relx=0.2,rely=0.6)
label_4=Label(frame_left,text="和谐")
label_4.place(relx=0.6,rely=0.6)

# 定义第二个容器
frame_right=Frame(root,bg="yellow")
frame_right.place(relx=0.5,rely=0.2,relwidth=0.3,relheight=0.6)

label_1=Label(frame_right,text="自由")
label_1.place(relx=0.2,rely=0.2)
label_2=Label(frame_right,text="平等")
label_2.place(relx=0.6,rely=0.2)
label_3=Label(frame_right,text="公正")
label_3.place(relx=0.2,rely=0.6)
label_4=Label(frame_right,text="法治")
label_4.place(relx=0.6,rely=0.6)

root.mainloop()

LabelFrame

from tkinter import *
root=Tk()

# 定义第一个容器
frame_left=LabelFrame(root,text="国家层面",labelanchor="n")
frame_left.place(relx=0.2,rely=0.2,relwidth=0.3,relheight=0.6)

label_1=Label(frame_left,text="富强")
label_1.place(relx=0.2,rely=0.2)
label_2=Label(frame_left,text="民主")
label_2.place(relx=0.6,rely=0.2)
label_3=Label(frame_left,text="文明")
label_3.place(relx=0.2,rely=0.6)
label_4=Label(frame_left,text="和谐")
label_4.place(relx=0.6,rely=0.6)

# 定义第二个容器
frame_right=LabelFrame(root,text="社会层面",labelanchor="n")
frame_right.place(relx=0.5,rely=0.2,relwidth=0.3,relheight=0.6)

label_1=Label(frame_right,text="自由")
label_1.place(relx=0.2,rely=0.2)
label_2=Label(frame_right,text="平等")
label_2.place(relx=0.6,rely=0.2)
label_3=Label(frame_right,text="公正")
label_3.place(relx=0.2,rely=0.6)
label_4=Label(frame_right,text="法治")
label_4.place(relx=0.6,rely=0.6)

root.mainloop()

frame

Grid网格布局,将控件放置到一个二维的表格里。
主控件被分割成一系列的行和列,表格中每个单元可以放置一个控件

from tkinter import *
class App:
    def __init__(self, master):
        self.master = master
        self.initWidgets()
    def initWidgets(self):
        #创建一个输入组件
        e = Entry(relief=SUNKEN, font=('Courier New', 24), width=25)
        #对该输入组件使用Pack布局,放在容器顶部
        e.pack(side=TOP, pady=10)
        p = Frame(self.master)
        p.pack(side=TOP)
        #定义字符串的元组
        names = ("0" , "1" , "2" , "3", "4" , "5" , "6" , "7" , "8" , "9"
                , "+" , "-" , "*" , "/" , ".", "=")
        #遍历字符串元组
        for i in range(len(names)):
            #创建Button,将Button放入p组件中
            b = Button(p, text=names[i], font=('Verdana', 20), width=6)
            b.grid(row=i // 4, column=i % 4)
root = Tk()
root.title("Grid布局")
App(root)
root.mainloop()

Pack:相对布局

当程序向容器中添加组件时,这些组件会依次向后排列,排列方向既是水平/垂直
from tkinter import * 
class App:
    def __init__(self, master):
        self.master = master
        self.initWidgets()
    def initWidgets(self):
        fm1 = Frame(self.master)#创建第一个容器
        fm1.pack(side=LEFT, fill=BOTH, expand=YES)#该容器放在左边排列
        #向fm1中添加3个按钮,设置按钮从顶部开始排列,且按钮只能在垂直方向填充
        Button(fm1, text='一').pack(side=TOP, fill=X, expand=YES)
        Button(fm1, text='二').pack(side=TOP, fill=X, expand=YES)
        Button(fm1, text='三').pack(side=TOP,  fill=X, expand=YES)
        fm2 = Frame(self.master)#创建第二个容器
        fm2.pack(side=LEFT, padx=10, expand=YES)#该容器放在左边排列,会挨着fm1
        #向fm2中添加3个按钮,设置按钮从右边开始排列
        Button(fm2, text='1').pack(side=RIGHT, fill=Y, expand=YES)
        Button(fm2, text='2').pack(side=RIGHT, fill=Y, expand=YES)
        Button(fm2, text='3').pack(side=RIGHT, fill=Y, expand=YES)       
        fm3 = Frame(self.master)#创建第三个容器
        fm3.pack(side=RIGHT, padx=10, fill=BOTH, expand=YES)
        #向fm3中添加3个按钮,设置按钮从底部开始排列,且按钮只能在垂直方向填充
        Button(fm3, text='Ⅰ').pack(side=BOTTOM, fill=X, expand=YES)
        Button(fm3, text='Ⅱ').pack(side=BOTTOM, fill=X, expand=YES)
        Button(fm3, text='Ⅲ').pack(side=BOTTOM, fill=X, expand=YES)
root = Tk()
root.title("Pack布局")
display = App(root)
root.mainloop()

Place:绝对布局,需要设置组件的x、y或relx、rely选项

Tkinter 容器内的坐标系统的原点 (0, 0) 在左上角,其中 X 轴向右延伸,Y 轴向下延伸
from tkinter import *
import random
class App:
    def __init__(self, master):
        self.master = master
        self.initWidgets()
    def initWidgets(self):
        #定义字符串元组
        books = ('语文', '数学', '英语', '物理', '化学')
        for i in range(len(books)):
            #生成3个随机数
            ct = [random.randrange(256) for x in range(3)]
            grayness = int(round(0.299*ct[0] + 0.587*ct[1] + 0.114*ct[2]))
            #将元组中3个随机数格式化成16进制数,转成颜色格式
            bg_color = "#%02x%02x%02x" % tuple(ct)
            #创建Label,设置背景色和前景色
            lb = Label(root,
                text=books[i],
                fg = 'White' if grayness < 120 else 'Black',
                bg = bg_color)
            #使用place()设置该Label的大小和位置
            lb.place(x = 20, y = 36 + i*36, width=180, height=30)
root = Tk()
root.title("Place布局")
root.geometry("250x250+30+30")#width x height + x_offset + y_offset  
App(root)
root.mainloop()

使用 x, y, height, width 直接指定位置和宽高
使用 relx, rely, relheight, relwidth 指定相对比例的宽高

在这里插入图片描述

Menu 下拉菜单和级联菜单/弹出菜单

from tkinter import *
root = Tk()

#下拉菜单和级联菜单
def callback():
    print("你好")
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=False)
filemenu.add_command(label='打开', command=callback)
filemenu.add_command(label='保存', command=callback)
filemenu.add_separator()#添加分割线
filemenu.add_command(label='退出', command=root.quit)
menubar.add_cascade(label='文件', menu=filemenu)#创建级联菜单,menu选项指定下一级的菜单是什么

editmenu = Menu(menubar, tearoff=False)
editmenu.add_command(label='剪切', command=callback)
editmenu.add_command(label='拷贝', command=callback)
editmenu.add_separator()#添加分割线
editmenu.add_command(label='粘贴', command=callback)
menubar.add_cascade(label='编辑', menu=editmenu) 

#弹出菜单
popmenubar = Menu(root)
popmenubar.add_command(label='撤销', command=callback)
popmenubar.add_command(label='重做', command=callback)
frame = Frame(root, width=512, height=512)
frame.pack()
def popup(event):
    popmenubar.post(event.x_root, event.y_root)
frame.bind("<Button-3>", popup)

root.config(menu=menubar)

OptionMenu

from tkinter import *
root = Tk()

OPTIONS = ['1','asf','hdfs','safsdv']
variable = StringVar()
variable.set(OPTIONS[0])
w = OptionMenu(root, variable, *OPTIONS)  #不加*整个列表会被作为一个选项
w.pack()

mainloop()

在这里插入图片描述
组件的显示、隐藏 place place_forget

from tkinter import *
root = Tk()

def hide():
    theLB.place_forget()
def show():
    theLB.place(relx=0.1,rely=0,relwidth=0.3,relheight=0.4)

# 创建一个空列表
theLB = Listbox(root)
# 往列表里添加数据
for item in ["鸡蛋", "鸭蛋", "鹅蛋", "李狗蛋"]:
    theLB.insert("end", item)

b1 = Button(root, text='隐藏', command=hide)
b2 = Button(root, text='显示', command=show)
b1.place(relx=0.2,rely=0.6,relwidth=0.2,relheight=0.2)
b2.place(relx=0.5,rely=0.6,relwidth=0.2,relheight=0.2)
root.mainloop()

在这里插入图片描述

事件

bind

import tkinter
win = tkinter.Tk()

def func_1(event):
    print("鼠标左键")
def func_2(event):
    print("鼠标滚轮")
def func_3(event):
    print("鼠标右键")
def func_4(event):
    print("鼠标双击左键")
def func_5(event):
    print("鼠标中键双击")
def func_6(event):
    print("鼠标右键双击")
def func_7(event):
    print("鼠标三击左键")
def func_8(event):
    print("左键移动")

button1 = tkinter.Button(win, text="测试")
#bind给控件绑定数据(参数一是绑定的事件,参数二是触发事件的函数)
###鼠标点击事件
#<Button-1>鼠标左键
#<Button-2>鼠标滚轮点击
#<Button-3>鼠标右键
#<Double-Button-1>鼠标双击左键
#<Double-Button-2>鼠标中键双击
#<Double-Button-3>鼠标右键双击
#<Triple-Button-1>鼠标三击左键
###鼠标移动事件
#<B1-Motion>左键移动
#<B2-Motion>中键移动
#<B3-Motion>右键移动
###鼠标释放事件
#<ButtonRelease-1>释放鼠标左键
#<ButtonRelease-2>释放鼠标中键
#<ButtonRelease-3>释放鼠标右键
###进入离开事件
#<Enter>当鼠标进入控件时触发事件
#<Leave>当鼠标离开控件时触发事件
button1.bind("<Button-1>", func_1)
button1.bind("<Button-2>", func_2)
button1.bind("<Button-3>", func_3)
button1.bind("<Double-Button-1>", func_4)
button1.bind("<Double-Button-2>", func_5)
button1.bind("<Double-Button-3>", func_6)
button1.bind("<Triple-Button-1>", func_7)
button1.bind("<B1-Motion>", func_8)
button1.pack()

win.mainloop()

command
简单的事件处理可通过选项来绑定,当用户单击指定按钮时,通过绑定的函数会被触发

comboxlist.bind("<<ComboboxSelected>>",go)#绑定事件,下拉列表框被选中时绑定go函数
listbox1.bind("<<ListboxSelect>>",show_msg)
from tkinter import *

def show_msg(*args):
    if len(self.listbox.curselection()) == 0:
        return
    indexs = list(listbox1.curselection())#返回一个元组,包含被选中选项序号(从0开始)
    index = indexs[0]
    listbox2.see(index)#调整列表框的位置,使index参数指定的选项是可见的
    listbox2.select_set(index)#设置参数指定选项为选中状态

root = Tk()
root.title("listbox练习")
#创建列表显示内容
names = ("梅长苏","誉王","飞流","夏冬","霓凰郡主","蒙挚","萧景睿","谢玉")
players = ("胡歌","黄维德","吴磊","张龄心","刘涛","陈龙","程皓枫","刘奕君")

list1 = StringVar(value=names)
list2 = StringVar(value=players)

#创建两个Listbox,分别设置为单选、多选类型
listbox1 = Listbox(root,height=len(names),listvariable=list1,selectmode="browse")
listbox2 = Listbox(root,height=len(players),listvariable=list2,selectmode="extended")

listbox1.grid(row=1,column=1,padx=(10,5),pady=10)
listbox2.grid(row=1,column=2,padx=(5,10),pady=10)
listbox1.select_set(4)

#设置第二个表格的字体色/背景色
for i in range(len(players)):
    listbox2.itemconfig(i,fg="blue")
    if not i%2:
        listbox2.itemconfig(i,bg="#f0f0ff")

#<<ListboxSelect>>绑定选择listbox项
#为第一个Listbox设置绑定事件
listbox1.bind("<<ListboxSelect>>",show_msg)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

春夏与冬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值