【问题标题】:Tkinter - unable to place button on middle Canvas/FrameTkinter - 无法在中间画布/框架上放置按钮
【发布时间】:2015-11-03 04:56:38
【问题描述】:

有人可以帮我解决我在 Tkinter 中遇到的问题吗?

我想在彼此下方创建三个框架/画布。一旦我在中间画布上放置了任何小部件(按钮/标签),画布的位置就会向下移动。

这是我的代码:

import tkinter as tk

class GameMain:
    def __init__(self):
        root = tk.Tk()
        top_bg = tk.PhotoImage(file="TopFrame.png")

        root.geometry("1280x900+3+3")
        cv=tk.Canvas(root,width=1280,height=100)
        cv.pack(side="top",fill="both",expand="yes")
        cv.create_image(0,0,image=top_bg,anchor='nw')
        Btn1 = tk.Button(cv,text="button1")
        Btn1.grid(row=0,column=0,padx=5,pady=5)
        Btn2 = tk.Button(cv,text="Button2")
        Btn2.grid(row=1,column=0,padx=5,pady=5)

        mcv=tk.Canvas(root,width=1280,height=700,bg="red",border=1)
        mcv.pack(side="top",fill="both",expand="yes")
        #Once I placed the following button, middle canvas moved down and shows empty spaces lot
        Btn3 = tk.Button(mcv,text="button1")
        Btn3.pack(padx=5,pady=5)
        Btn4 = tk.Button(mcv,text="Button2")
        Btn4.pack(padx=5,pady=5)

        bcv=tk.Canvas(root,width=1280,height=100,bg="yellow")
        bcv.pack(side="top",fill="both",expand="yes")

        root.mainloop()

GameMain()

【问题讨论】:

  • 你想让这三幅画布保持你给它们的高度吗?

标签: python tkinter


【解决方案1】:

任何小部件的默认行为是展开或收缩以完全适合其所有子小部件。以我的经验,这种行为以最少的工作量为您提供最灵活的 UI。此功能称为“几何传播”。

如果您想强制容器小部件具有特定大小,您可以给它一个大小,然后关闭几何传播。例如,您可以添加这行代码:

mcv.pack_propagate(False)

但是,要真正将小部件强制为特定大小需要更多工作,因为它取决于如何将 it 添加到 its 父级。实际上,在 UI 设计中,无论小部件内部是什么,都希望小部件具有非常特定的大小。

通常情况下,您的问题有更好的解决方案。例如,您将窗口高度设置为 900,有两个 100 像素高的窗口和一个 700 像素高的窗口。通过简单地强制中间窗口占用任何额外空间(以及让其他窗口占用额外空间),您可以获得相同的效果,而无需关闭几何传播。

在不知道您想要实现的确切外观和行为的情况下,很难提出具体的建议。

【讨论】:

    【解决方案2】:

    这个问题的确切原因有点令人费解;在画布上添加按钮的方法是改变它的几何形状。解决此问题的方法是强制画布保持至少 700 像素高(有点像将一根棍子楔入门中以保持门打开)。为此,我在画布的一侧添加了frame,并为其添加了pady=350 的填充。为什么是350?因为它将在上方和下方填充 350 个像素(因此加起来为 700)。只要您不向框架添加任何内容,它将保持不可见。这是一个适合您的工作示例:

    mcv=tk.Canvas(root,width=1280,height=700,bg="red",border=1)
    mcv.pack(side="top",fill="both",expand="yes")
    frame = tk.Frame(mcv)  # Add this frame to your canvas.
    frame.pack(side="left", anchor="nw", pady=350)
    Btn3 = tk.Button(mcv,text="button1")
    Btn3.pack(padx=5,pady=5)
    Btn4 = tk.Button(mcv,text="Button2")
    Btn4.pack(padx=5,pady=5)
    

    【讨论】:

    • “在画布上添加按钮会改变它的几何形状”:“某事”一点也不令人费解。这是任何 tkinter 小部件的默认行为——当您使用 packgrid 管理内部小部件时,包含的小部件会“缩小以适应”。
    猜你喜欢
    • 2018-05-05
    • 2021-09-28
    • 1970-01-01
    • 2018-05-11
    • 2022-10-23
    • 2016-09-02
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多