【问题标题】:How can I choose coordinate of tkinter frame?如何选择 tkinter 框架的坐标?
【发布时间】:2019-10-30 10:30:49
【问题描述】:

我正在尝试使用 Tkinter,因为我正在尝试放置树框。两个框架必须并排放置:红色一个和蓝色一个。 (见frame image)。我用这个指令放置这两个框架:

redFrame = tk.Frame(master=masterFrame, bg='red')
redFrame.pack_propagate(0)
redFrame.pack(fill='both', side='left', expand='True')

blueFrame = tk.Frame(master=masterFrame, bg='blue')
destFrame.pack_propagate(0)
destFrame.pack(fill='both', side='right', expand='True')

现在我想在红色的里面再放一个框架(绿色),放在主界面的左边:

greenFrame = tk.Frame(master=masterFrame, width=100, height=100, bg='green')
greenFrame.pack_propagate(0)
greenFrame.pack(side='bottom', padx=0, pady=0)

问题是我无法选择它的位置。它仍然保留在窗口的顶部并居中。

如果我更改 padx 参数,则没有任何变化。

如果我更改 pady 参数,框架会更改其 Y 位置。为什么这没有附加到 X 位置?

【问题讨论】:

    标签: python tkinter position frame pack


    【解决方案1】:

    默认情况下,小部件将在容器内分配的空间中居中。

    你的代码目前不起作用,所以我把它改成了这个(我认为它模仿了你现在所说的):

    import tkinter as tk
    
    root = tk.Tk()
    root.geometry("600x400")
    
    redFrame = tk.Frame(root, bg='red')
    redFrame.pack_propagate(0)
    redFrame.pack(fill='both', side='left', expand='True')
    
    blueFrame = tk.Frame(root, bg='blue')
    blueFrame.pack_propagate(0)
    blueFrame.pack(fill='both', side='right', expand='True')
    
    greenFrame = tk.Frame(redFrame, width=100, height=100, bg='green')
    greenFrame.pack_propagate(0)
    greenFrame.pack(side='top', padx=0, pady=0)
    
    root.mainloop()
    

    如果您运行此代码,greenFrame 将显示为您的图像所示,位于顶部并在 redFrame 内部居中。

    如果你想让greenFrame出现在redFrame的左上角,你可以改变框架的锚点:

    greenFrame = tk.Frame(redFrame, width=100, height=100, bg='green')
    greenFrame.pack_propagate(0)
    greenFrame.pack(side='top', padx=0, pady=0, anchor='w')
    

    这是因为当您使用 pack 执行 side="top" 时,小部件会被分配一整条水平空间。默认情况下,它在该空间内居中:

    如果您执行side="left",则小部件会被分配一整条垂直空间,并且默认情况下它会在该空间中居中。

    但是,在这两种情况下,您都可以更改锚点,以便您的组件在分配的空间内以不同的方式放置。

    这是实现(我认为)您想要的代码:

    import tkinter as tk
    
    root = tk.Tk()
    root.geometry("600x400")
    
    redFrame = tk.Frame(root, bg='red')
    redFrame.pack_propagate(0)
    redFrame.pack(fill='both', side='left', expand='True')
    
    blueFrame = tk.Frame(root, bg='blue')
    blueFrame.pack_propagate(0)
    blueFrame.pack(fill='both', side='right', expand='True')
    
    greenFrame = tk.Frame(redFrame, width=100, height=100, bg='green')
    greenFrame.pack_propagate(0)
    greenFrame.pack(side='top', padx=0, pady=0, anchor='w')
    
    root.mainloop()
    

    【讨论】:

    • 谢谢。我试图这样做,但是使用“greenFrame”的“grid”选项,做一些奇怪的事情。红框看起来不是左居中的,但它的宽度似乎比红框高。为什么会出现这种情况?有偏移吗?同时更改“行”和“列”值没有任何变化。
    • 您的某些陈述不正确。例如,这是错误的:“如果您希望 greenFrame 出现在 redFrame 的左上角,那么使用 pack 是不可能的。”。此外,“小部件将始终在容器内分配的空间中居中。” 并不完全正确。默认情况下它们会居中,但有一些选项可以更改,因此您不能说它们将始终在分配的空间中居中。
    • 我找到了解决方案。看看这个视频,很有用。他使用place() 属性。 youtube.com/watch?v=D8-snVfekto
    • @BryanOakley 你能分享一下如何使用 Pack 做到这一点吗?
    • @JoseSalvatierra:使用答案开头的代码,您只需将anchor="w" 添加到绿框:greenFrame.pack(side='top', padx=0, pady=0, anchor="w")
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2021-07-18
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多