如何停止自动调整框架大小

时间:2016-09-12 21:13:51

标签: python tkinter

我有三个框架,但是当出现新标签时,框架会自动重新调整为新尺寸。如何停止重新调整并使每个帧的大小设置为不可变。

#Import tkinter to make gui
from tkinter import *
from tkinter import ttk
import codecs

#Program that results when user attempts to log in
def login(*args):
    file = open("rot13.txt", "r")
    lines = file.readlines()
    uname = user.get()
    pword = pw.get()

    for i in lines:
        x = i.split()
        if codecs.encode(uname,'rot13') == x[0] and codecs.encode(pword,'rot13') == x[1]:
            result.set("Successful")
            break;
        else:
            result.set("Access Denied")

root = Tk()
root.title("Login")

#Configures column and row settings and sets padding
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe['borderwidth'] = 5
mainframe['relief'] = "solid"
mainframe.grid(column=1, row=1, columnspan=3, rowspan=2)
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

mainframe2 = ttk.Frame(root, padding="3 3 12 12")
mainframe2['borderwidth'] = 5
mainframe2['relief'] = "solid"
mainframe2.grid(column=1, row=3, columnspan=1, rowspan=3)
mainframe2.columnconfigure(0, weight=1)
mainframe2.rowconfigure(0, weight=1)

mainframe3 = ttk.Frame(root, padding="3 3 12 12")
mainframe3['borderwidth'] = 5
mainframe3['relief'] = "solid"
mainframe3.grid(column=2, row=5)
mainframe3.columnconfigure(0, weight=1)
mainframe3.rowconfigure(0, weight=1)

#anchors for widgets
user = StringVar()
pw = StringVar()
result = StringVar()

#Asks user input
user_entry = ttk.Entry(mainframe, width=20, textvariable=user)
user_entry.grid(column=2, row=1, sticky=(W, E))

pw_entry = ttk.Entry(mainframe, width=20, textvariable=pw)
pw_entry.grid(column=2, row=2, sticky=(W, E))


#Labels to make user-friendly and able to understand
ttk.Label(mainframe, text="Username ").grid(column=1, row=1, sticky=W)
ttk.Label(mainframe, text="Password ").grid(column=1, row=2, sticky=W)
ttk.Label(mainframe2, text="").grid(column=1, row=3, sticky=W)
ttk.Label(mainframe2, text="Result").grid(column=1, row=4, sticky=W)
ttk.Label(mainframe2, text="").grid(column=1, row=5, sticky=W)

#Button to log in
ttk.Button(mainframe3, text="Login", command=login).grid(column=3, row=5, sticky=(W,E))

#Makes a spot to put in result
ttk.Label(mainframe2, textvariable=result).grid(column=2, row=4, sticky=(W, E))
#Opens up with item selected and allows you to enter username without having to click it
user_entry.focus()
#Runs calculate if click enter
root.bind('<Return>', login)
root.mainloop()

以下是结果的前后图片:

beginning

and then after a result appears this happens

正如您所看到的,在程序运行之后,框架会改变尺寸。如何停止重新调整尺寸并坚持预定尺寸?

2 个答案:

答案 0 :(得分:0)

在这种特定情况下,最简单的解决方案是为标签提供固定宽度的文本。当您为标签指定固定宽度时,tkinter会尽力遵守该宽度(尽管很大程度上取决于您使用packplace或{将其放置在屏幕上的方式{1}})。

grid

另一种解决方案是关闭几何体传播,这意味着您负责为帧提供明确的宽度和高度:

ttk.Label(..., width=12).grid(...)

我不建议关闭几何传播。 Tkinter通常非常擅长计算小部件的正确大小,如果更改字体,屏幕分辨率或根窗口大小,这通常会导致非常糟糕的行为。

答案 1 :(得分:0)

只需向width添加ttk.Label(mainframe2, textvariable=result).grid(column=2, row=4, sticky=(W, E))选项:
所以它会变成这样:
ttk.Label(mainframe2, textvariable=result, width=20).grid(column=2, row=4, sticky=(W, E))