首页 > 解决方案 > 如何动态设置小部件的大小以适应 Tkinter 中的窗口?

问题描述

我的桌面分辨率是 1920x1080,我正在为相同的环境进行开发,1440x900 或更小(取决于用户的屏幕分辨率)当我使用 1920x1080 分辨率时,所有小部件都可见,但是当分辨率改变时,一些小部件不可见. 但是我使用了网格方法。该怎么办?

这是一个示例代码:

from tkinter import *
import tkinter as tk


root = Tk()
width=1440
height=900
root.geometry('%dx%d+0+0' % (width,height))
print(width, height)

frame1=LabelFrame(root, text="frame1")

frame2=LabelFrame(root, text="frame2")

frame1.pack(fill="both", expand="yes", padx=20, pady=10)

frame2.pack(fill="both", expand="no", padx=20, pady=10)



abc=StringVar()
Label(frame2, text="A").grid(row=1, column=0, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=1, column=1, padx=5, pady=3,sticky="nsew")

Label(frame2, text="B").grid(row=1, column=2, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=1, column=3, padx=5, pady=3,sticky="nsew")

Label(frame2, text="C").grid(row=1, column=4, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=1, column=5, padx=5, pady=3,sticky="nsew")

Label(frame2, text="D").grid(row=1, column=6, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=1, column=7, padx=5, pady=3,sticky="nsew")



Label(frame2, text="E").grid(row=2, column=0, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=2, column=1, padx=5, pady=3,sticky="nsew")

Label(frame2, text="F").grid(row=2, column=2, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=2, column=3, padx=5, pady=3,sticky="nsew")

Label(frame2, text="G").grid(row=2, column=4, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=2, column=5, padx=5, pady=3,sticky="nsew")

Label(frame2, text="H").grid(row=2, column=6, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=2, column=7, padx=5, pady=3,sticky="nsew")



Label(frame2, text="I").grid(row=4, column=0, padx=5, pady=3)
bla=Text(frame2, width=220, height=2.5, font=("Calibri", 14))
bla.grid(row=4, column=1, columnspan=11, padx=5, pady=3, sticky="nsew")

Label(frame2, text="J").grid(row=3, column=0, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=3, column=1, padx=5, pady=3,sticky="nsew")



Label(frame2, text="K").grid(row=3, column=2, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=3, column=3, padx=5, pady=3,sticky="nsew")


Label(frame2, text="L").grid(row=5, column=0, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=5, column=1, padx=5, pady=3,sticky="nsew")

Label(frame2, text="M").grid(row=5, column=2, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=5, column=3, columnspan=2, padx=5, pady=3,sticky="nsew")

Label(frame2, text="N").grid(row=5, column=5, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=5, column=6, padx=5, pady=3,sticky="nsew")

Label(frame2, text="O").grid(row=5, column=7, padx=5, pady=3)
Entry(frame2, textvariable=abc).grid(row=5, column=8,columnspan=3, padx=5, pady=3,sticky="nsew")


root.mainloop()

感谢你

标签: pythontkinterresize

解决方案


问题是您明确将文本小部件宽度设置为 220 个字符。根据字体的不同,这可能会使小部件的宽度超过 1440 像素。在我的机器上,小部件最终是 1988 像素。正因为如此,它会强制列比窗口中的宽度更宽。

在这种特定情况下,简单的解决方案似乎是明确设置文本小部件的大小。将其保留为自然大小,并让几何管理器使其扩展以填充窗口。如果您确实需要 220 个字符宽,则需要将字体变小以适应窗口的约束。

作为一般的经验法则,您应该将小部件的大小设置为所需的最小大小,并让几何管理器控制使它们足够大以填充任何额外的空间。


推荐阅读