前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tkinter -- Place

tkinter -- Place

作者头像
py3study
发布2018-08-03 10:20:59
9930
发布2018-08-03 10:20:59
举报
文章被收录于专栏:python3

使用绝对坐标将组件放到指定的位置

代码:

代码语言:javascript
复制
import tkinter as tk
root = tk.Tk()
lb = tk.Label(root, text='hello place')
# 使用绝对坐标将 Label 放置到(0,0)位置上
lb.place(x=0,y=0,anchor='nw')
root.mainloop()

结果:

blob.png
blob.png

x,y 指定组件放置的绝对位置

使用相对坐标放置组件位置

代码:

代码语言:javascript
复制
import tkinter as tk
root = tk.Tk()
lb = tk.Label(root, text='hello place')
# 使用相对坐标(0.5,0.5)将 Label 放置到(0.5*sx,0.5.sy)位置上
lb.place(relx=0.5,rely=0.5,anchor='center')
root.mainloop()

结果:

blob.png
blob.png

relx,rely 指定组件放置的绝对位置,范围为(0-1.0)

使用 place 同时指定多个组件

代码:

代码语言:javascript
复制
import tkinter as tk
root = tk.Tk()
root.geometry('500x80')  # 设置初始root大小
v = tk.IntVar()  # 引用变量数字
lb = tk.Label(root, text='hello place')
# 使用相对坐标(0.5,0.5)将 Label 放置到(0.5*sx,0.5.sy)位置上
for i in range(5):
    tk.Radiobutton(root,
                   text='Radio'+str(i),
                   variable=v,
                   value=i,  # 设置变量值为i
                   ).place(x=80*i, anchor='nw')
root.mainloop()

结果:

blob.png
blob.png

使用 place 来指定各个 Radiobutton 的位置

同时使用相对和绝对坐标

同时设置 relx,rely 和 x,y 的值

代码:

代码语言:javascript
复制
import tkinter as tk
root = tk.Tk()
root.geometry('500x200')  # 设置初始root大小
v = tk.IntVar()  # 引用变量数字
lb1 = tk.Label(root, text='hello place',fg='red')
lb2 = tk.Label(root, text='hello place',fg='blue')
# 先设置相对坐标为(0.5,0.5),再使用(5,10)将坐标作偏移(5,10)
lb1.place(relx=0.5,rely=0.5,anchor='center',x=5,y=10)

# 先设置相对坐标为(0.5,0.5),再使用(25,30)将坐标作偏移(25,30)
lb2.place(relx=0.5,rely=0.5,anchor='center',x=25,y=30)
root.mainloop()

结果:

blob.png
blob.png

同时使用相对和绝对坐标时,相对坐标优先操作,然后是在这个相对坐标的基础上进行偏移

使用 in 来指定放置的容器

使用 in 属性来指定放置到的容器是那一个

代码:

代码语言:javascript
复制
import tkinter as tk
root = tk.Tk()
root.geometry('500x200')  # 设置初始root大小
v = tk.IntVar()  # 引用变量数字
lb1 = tk.Label(root, text='hello place',fg='red')
bt1 = tk.Button(root, text='hello button',fg='blue')
# 创建一个 Label
lb1.place(relx=0.5,rely=0.5,anchor='center')

# 在 root 同创建一个 Button,目的是与 bt1相比较
bt2 = tk.Button(root, text='button in root',fg='yellow')
bt2.place(anchor='w')
# 在 Label 中创建一个 Button
bt1.place(in_=lb1, anchor='w')
root.mainloop()

结果:

blob.png
blob.png

注意 bt2放置的位置是在 root 的(0,0)处,而 button1放置的位置是在 lb1的(0,0)处,原因是由于 bt1使用了 in 来指定放置的窗口为 lb1

深入 in 用法

使用 in 属性来指定放置到的容器是那一个,仅能是其 master

代码:

代码语言:javascript
复制
import tkinter as tk
root = tk.Tk()

# 创建两个 Frame 用作容器
fm1 = tk.Frame(root,bg='red',width=40,height=40)
fm2 = tk.Frame(root,bg='blue',width=40,height=40)

# 再在 fm1中创建一个 fm3
fm3 = tk.Frame(root,bg='yellow',width=20,height=20)

# 创建一个 Label,它的 master 为 fm1
lb1 = tk.Label(fm1,text='hello place',fg='green')
lb1.place(in_=fm1, relx=0.5,rely=0.5,anchor='center')

# 创建一个 Button,它的 master 为 fm1
bt1 = tk.Button(fm1, text='hello place', fg='red')

# 将 bt1放置到 fm2中,程序报错
# 去掉下面这条语句就可以使用了,可以看到 lb1已经正确的放置到 fm1的中心位置了
# bt1.place(in_=fm2, anchor='w')

# 将 bt1放置到 fm3中,程序报错
# bt1.place(in_=fm3, anchor='w')

fm1.pack()
fm2.pack()
fm3.pack()
root.mainloop()

结果:

blob.png
blob.png

in 不是可以随意指定放置的组件的,如果使用 in 这个参数这个组件必需满足:是其父容器或父容器的子组件

事件与 Place 结合使用

最后使用两个 place 方法来动态改变两个 Frame 的大小

代码:

代码语言:javascript
复制
import tkinter as tk
root = tk.Tk()
split=0.5  # 定义变量

# 创建两个 Frame 用作容器
fm1 = tk.Frame(root,bg='red',width=40,height=40)
fm2 = tk.Frame(root,bg='blue',width=40,height=40)

# 单击 fm1时增大它的占有区域0.1
def incFm1(event):
    global split
    if split < 1:
        split += 0.1
    fm1.place(rely=0,relheight=split,relwidth=1)
    fm2.place(rely=split, relheight=1-split, relwidth=1)

# 单击 fm2时增大它的占有区域0.1
def incFm2(event):
    global split
    if split > 0:
        split -= 0.1
        fm1.place(rely=0, relheight=split, relwidth=1)
        fm2.place(rely=split, relheight=1-split, relwidth=1)

# 这两语句要使用,不然开始看不到两个 frame,也就没法点击它们了
fm1.place(rely=0, relheight=split, relwidth=1)
fm2.place(rely=split, relheight=1-split, relwidth=1)

# 绑定单击事件
fm1.bind('',incFm1)
fm2.bind('',incFm2)

root.mainloop()

结果:

444.gif
444.gif

为 SplitWindow 的原型了,再改动一下就可以实现一个 SplitWindow 了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/06/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档