python UI 之使用tkinter库制作界面时实现拖动时零件跟随变化

python UI 之使用tkinter库制作界面时实现拖动时零件跟随变化

在用tkinter写界面的时候,想要界面被拖动变大变小的时候,界面里面的零件(按钮、文本一类)也跟着一起变动,该怎么办呢?
可以通过在界面里面添加Frame,然后把零件都写在Frame里面,通过grid来给零件和Frame定位,注意一定要在grid里面写好sticky,这样就可以实现啦

以登录注册页面为例

首先import tkinter.messagebox
from tkinter import *

class Login1(object):
    def __init__(self, root):
        self.root = root
        root.rowconfigure(0, weight=1)
        root.columnconfigure(0, weight=1)
        # variables
        self.varName = StringVar(value='')
        self.varPwd = StringVar(value='')
        # labels
        self.labelEmail = tkinter.Label(self.root, text='邮箱')
        self.labelPwd = tkinter.Label(self.root, text='密码')
        # entries
        self.entryEmail = tkinter.Entry(self.root, textvariable=self.varName)
        self.entryPwd = tkinter.Entry(self.root, show='*', textvariable=self.varPwd)
        # buttons
        self.buttonOk = tkinter.Button(self.root, text='登录')
        self.buttonCancel = tkinter.Button(self.root, text='取消')
        self.buttonExchange = tkinter.Button(self.root, text='注册')

        self.arrange()
        self.root.mainloop()

    def arrange(self):

        self.labelEmail.grid(row=0, padx=10, pady=10)
        self.labelPwd.grid(row=1,  padx=10, pady=10)

        self.entryEmail.grid(row=0, column=1, padx=10, pady=10, columnspan=2)
        self.entryPwd.grid(row=1, column=1, padx=10, pady=10, columnspan=2)
        self.buttonOk.grid(row=3, column=0, padx=10, pady=10 )
        self.buttonCancel.grid(row=3, column=1, padx=10, pady=10 )
        self.buttonExchange.grid(row=3, column=2, padx=10, pady=10,)

root=tkinter.Tk()
root.title('注册')
if __name__=="__main__":
    Login1(root)

以上代码的效果是
在这里插入图片描述
在这里插入图片描述
可以注意到,当我们拖动边框右边的时候,零件不自然移动。

解决办法

加入一个frame作为框架,再写入sticky

class Login(object):
    def __init__(self, root):
        self.root = root
        root.rowconfigure(0, weight=1)
        root.columnconfigure(0, weight=1)
#######################################################
        self.frame = Frame(self.root)
        self.frame.grid(row=0, padx=10, pady=10, sticky=NSEW)
#######################################################
        # variables
        self.varName = StringVar(value='')
        self.varPwd = StringVar(value='')
        # labels
        self.labelEmail = tkinter.Label(self.frame, text='邮箱')
        self.labelPwd = tkinter.Label(self.frame, text='密码')
        # entries
        self.entryEmail = tkinter.Entry(self.frame, textvariable=self.varName)
        self.entryPwd = tkinter.Entry(self.frame, show='*', textvariable=self.varPwd)
        # buttons
        self.buttonOk = tkinter.Button(self.frame, text='登录')
        self.buttonCancel = tkinter.Button(self.frame, text='取消')
        self.buttonExchange = tkinter.Button(self.frame, text='注册')

        self.arrange()
        self.root.mainloop()

    def arrange(self):
        self.frame.rowconfigure(0, weight=1)
        self.frame.rowconfigure(1, weight=1)
        self.frame.rowconfigure(2, weight=1)
        self.frame.columnconfigure(0, weight=1)
        self.frame.columnconfigure(1, weight=1)
        self.frame.columnconfigure(2, weight=1)
#######################################################
        self.labelEmail.grid(row=0, sticky=NSEW, padx=10, pady=10)
        self.labelPwd.grid(row=1, sticky=NSEW, padx=10, pady=10)

        self.entryEmail.grid(row=0, column=1, padx=10, pady=10, columnspan=2, sticky=EW)
        self.entryPwd.grid(row=1, column=1, padx=10, pady=10, columnspan=2, sticky=EW)
        self.buttonOk.grid(row=3, column=0, padx=10, pady=10, sticky=NSEW)
        self.buttonCancel.grid(row=3, column=1, padx=10, pady=10, sticky=NSEW)
        self.buttonExchange.grid(row=3, column=2, padx=10, pady=10, sticky=NSEW) #######################################################

有改动的代码我都用#######框出来了,以方便读者参阅。
我们看看效果:
在这里插入图片描述
在这里插入图片描述
可以看到这个界面很自然的被拉长。

以上是我的代码和方法,如有问题欢迎指出。
谢谢大家!

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值