如何使 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
的允许值是字符串 nw、w、sw, s, se, e, ne , n, 和 center.
例如,通过将小部件的中心放置在相对坐标 .5/.5:
中,无论 window 的大小如何,标签都将保持居中
label = tk.Label(root, hello, world)
label.place(relx=.5, rely=5. anchor="center")
我正在尝试为项目创建 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
, andrely
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
的允许值是字符串 nw、w、sw, s, se, e, ne , n, 和 center.
例如,通过将小部件的中心放置在相对坐标 .5/.5:
中,无论 window 的大小如何,标签都将保持居中label = tk.Label(root, hello, world)
label.place(relx=.5, rely=5. anchor="center")