如何使 Tkinter 中的 GUI 可扩展

How to make a GUI in Tkinter scalable

我正在尝试为项目创建 GUI。其代码如下。我有一个关于可伸缩性的问题。在我的脚本中,我让 Tkinter 全屏显示 GUI。然而,由于 relx 的性质和就地依赖,它使标签或按钮从相对的 x 和 y 位置开始。然而,这将意味着在不同的屏幕上它看起来会不一样。例如,由于 relx 和 rely 指示小部件从哪里开始(而不是中间),每次更改屏幕尺寸时外观都会发生变化。我已经展示了两张图片,我认为它们展示了我的观点。在左图中,我设法将小部件定位在中间,但是由于缩小时小部件开始位置的性质,关闭小部件不再位于中间。请注意,它仍然以相同的 relx 和 rely 开始,但不再位于中间。

基本上有一种方法可以使其可扩展,因此无论 window 的大小如何,它看起来都一样。这可以通过确保 relx 和依赖指示中间位置而不是小部件的开始来完成吗?

from tkinter import *
import tkinter.font as tkFont

root = Tk()
root.title("N Body Simulation")

def exitclick():
    root.destroy()

class FullScreenApp(object):
def __init__(self, master, **kwargs):
    self.master = master
    pad = 3
    self._geom = '200x200+0+0'
    master.geometry("{0}x{1}+0+0".format(
        master.winfo_screenwidth() - pad, master.winfo_screenheight() - pad))
    master.bind('<Escape>', self.toggle_geom)

def toggle_geom(self, event):
    geom = self.master.winfo_geometry()
    print(geom, self._geom)
    self.master.geometry(self._geom)
    self._geom = geom


frame = Frame(root)
frame.pack()

fontStyle = tkFont.Font(family="Lucida Grande", size=20)
text_intro = "This is the GUI for the N-Body simulation, from here you can change the plents and the initial conditions"
label = Label(root, text=text_intro, font=fontStyle)
label.place(relx=0.1, rely=0.1)

close_button = Button(root, text="Close", command=exitclick, height=10, width = 30)
# close_button.place(relx=0.8, rely=20)
close_button.place(relx=0.4, rely=0.8)


e = Entry(root, width=35, borderwidth=5)
app = FullScreenApp(root)

root.mainloop()

您可以使用 anchor 选项来控制小部件的哪一部分位于给定位置。

这是 anchor 的规范文档,来自 tcl/tk 文档,针对 tkinter 稍作调整:

anchor where - where specifies which point of window is to be positioned at the (x,y) location selected by the x, y, relx, and rely options. The anchor point is in terms of the outer area of window including its border, if any. Thus if where is se then the lower-right corner of window's border will appear at the given (x,y) location in the master. The anchor position defaults to nw.

anchor 的允许值是字符串 nwwsw, s, se, e, ne , n, 和 center.

例如,通过将小部件的中心放置在相对坐标 .5/.5:

中,无论 window 的大小如何,标签都将保持居中
label = tk.Label(root, hello, world)
label.place(relx=.5, rely=5. anchor="center")