如何停止帧的自动调整大小

2024-10-06 12:25:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

#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

如你所见,在程序运行后,帧的大小会发生变化。我如何停止重新调整尺寸并坚持预定尺寸?在


Tags: totextcolumnrootlabelgridrowttk
2条回答

只需将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))

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

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

另一种解决方案是禁用几何体传播,这意味着您负责为帧指定明确的宽度和高度:

^{pr2}$

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

相关问题 更多 >