python - 如何动态设置小部件的大小以适应 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()
感谢你
解决方案
问题是您明确将文本小部件宽度设置为 220 个字符。根据字体的不同,这可能会使小部件的宽度超过 1440 像素。在我的机器上,小部件最终是 1988 像素。正因为如此,它会强制列比窗口中的宽度更宽。
在这种特定情况下,简单的解决方案似乎是不明确设置文本小部件的大小。将其保留为自然大小,并让几何管理器使其扩展以填充窗口。如果您确实需要 220 个字符宽,则需要将字体变小以适应窗口的约束。
作为一般的经验法则,您应该将小部件的大小设置为所需的最小大小,并让几何管理器控制使它们足够大以填充任何额外的空间。
推荐阅读
- vue.js - UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'length' of undefined on Laravel Mix with vuetify-loader
- sql - SQL:是否可以将 data_type 传递给变量中的函数?(功能转换)
- c# - 将来自 DataReader 的所有结果以 JSON 格式写入文件,同时保持整个结果集超出内存
- mysql - 我如何在这个查询中得到正确的结果?
- python - python多处理池 - 创建的工人数量错误
- python - Opencv 2.4.13 需要 python 2.7,但是 Monoocular Total Capture repo 需要 python 3.5
- c# - BigInteger.TryParse 在本地工作,但不能在 Azure VM 上工作
- python - 如何检查熊猫列是否包含值
- java - 如何用这个字符串分割一个字符串:|||
- regex - 在 bash 中使用正则表达式列出文件 | 忽略具有某些字符的文件