【问题标题】:How to make a GUI in Tkinter scalable如何使 Tkinter 中的 GUI 可扩展
【发布时间】:2021-03-25 12:51:46
【问题描述】:

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

本质上,有一种方法可以使其可扩展,因此无论窗口大小如何,它看起来都一样。这可以通过确保 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()

【问题讨论】:

  • 作为一般规则,gridpack 可以更轻松地制作响应式 GUI,然后使用 place。至于你关于relxrely 的cmets,我无法理解你在问什么。它们是相对的,所以 0.4 的 relx 将是窗口宽度的 4/10,无论窗口有多大或多小。如果您希望标签位于特定像素位置,您可以使用绝对坐标。我们无法知道您希望 UI 是什么样子,因此无法就如何布局给出好的建议。
  • “这可以通过确保 relx 和依赖指示中间的位置而不是小部件的开始来完成吗?” 你可以使用 anchor 选项来做到这一点到place。很难说这是否适用于您的情况,因为尚不清楚您要完成什么。
  • 1.我尝试使用网格,但是当我增加图形大小时使用它时,它没有相应地缩放。 2. 我所说的相对 cme​​ts 的意思是,如果你减小图形的大小,它不会只是较大图形的较小版本。在不同大小的窗口中,距离的比率会有所不同。如果 relx 指示小部件的中间位置而不是开始位置,则情况并非如此。
  • 抱歉问题不清楚,希望编辑有所帮助。本质上,我是在问如何将小部件保持在中间,而不管窗口大小如何,目前两张图片中都不是这种情况。

标签: python user-interface tkinter tk


【解决方案1】:

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

这是 tcl/tk 文档中anchor 的规范文档,针对 tkinter 进行了微调:

anchor where - where 指定窗口的哪个点定位在@987654323 选择的 (x,y) 位置@、yrelxrely 选项。锚点是根据窗口的外部区域,包括其边界(如果有)。因此,如果 se 在哪里,则窗口边框的右下角将出现在主窗口中给定的 (x,y) 位置。锚点位置默认为 nw

anchor 的允许值为字符串 nwwsws、se、enencenter

例如,通过将小部件的中心放置在相对坐标 .5/.5 处,无论窗口大小如何,这都会使标签保持居中:

label = tk.Label(root, hello, world)
label.place(relx=.5, rely=5. anchor="center")

【讨论】:

  • 啊,好吧,完美,正是我想要的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2023-01-21
  • 1970-01-01
相关资源
最近更新 更多