【问题标题】:Why won't my frame pack python3 tkinter为什么我的框架不打包 python3 tkinter
【发布时间】:2018-03-04 05:25:31
【问题描述】:

当我运行下面的代码时,我没有收到错误,但底部框架没有出现在窗口中,请告诉我为什么以及如何让它出现(请使用打包方法 NOT GRID)。我正在使用 Python 3.5.0

import tkinter 
from tkinter import *
root = tkinter.Tk()
root.geometry("1920x1080")
TopFrame = Frame(root, width=1920, height=200, bg= "green")
TopFrame.pack(side=TOP)
MiddleRightFrame = Frame(root, width=1120, height=730, bg="orange")
MiddleRightFrame.pack(side=RIGHT)
MiddleLeftFrame = Frame(root, width=800, height=730, bg="black")
MiddleLeftFrame.pack(side=LEFT)
BottomFrame = Frame(root, width=1920, height=150, bg="blue")
BottomFrame.pack(side=BOTTOM)

【问题讨论】:

  • 有多种方法可以让您的蓝框可见。为您想要的精确 GUI 提供图像。
  • 您确实意识到您的框架会在包含其他内容时立即缩小或扩大,对吧?
  • 是的,我要让按钮的大小与框架的大小完全相同,我将使用 8 个大小均匀的按钮,每个按钮的高度为 150,宽度为 240
  • 我认为您是在强制采用一种过于直接的方式来生成 GUI,这会使这一切变得不必要地复杂化。我认为place 优于网格或包装的地方。
  • 当您说“让它出现”时,您希望它出现在哪里?如果有空间,它会出现在左右帧之间。你想让它出现在窗口的最底部,跨越整个窗口吗?

标签: python python-3.x tkinter


【解决方案1】:

您的MiddleLeftFrame 是 800 像素宽。您的 MiddleRightFrame 是 1120 像素。 1120 + 800 = 1920。你强制窗口只有 1920 像素宽,所以蓝框没有空间。

删除此行,您的框架将出现:root.geometry("1920x1080")

如果您的意图是让它出现在窗口的底部,跨越窗口的整个宽度,那么在它调用 pack 之前,在左侧和右侧调用 pack

另外,我强烈建议将您的 pack 语句组合在一起。根据我的经验,它使代码更易于管理(而且我有很多经验!)。

import tkinter 
from tkinter import *
root = tkinter.Tk()
root.geometry("1920x1080")

TopFrame = Frame(root, width=1920, height=200, bg= "green")
MiddleRightFrame = Frame(root, width=1120, height=730, bg="orange")
MiddleLeftFrame = Frame(root, width=800, height=730, bg="black")
BottomFrame = Frame(root, width=1920, height=150, bg="blue")

TopFrame.pack(side=TOP)
BottomFrame.pack(side=BOTTOM)
MiddleRightFrame.pack(side=RIGHT)
MiddleLeftFrame.pack(side=LEFT)

root.mainloop()

这个工作的原因是由于打包器算法。当您将某物放在左侧或右侧时,它将分配该侧所有剩余的垂直空间。因此,在你在左右打包之后再在底部打包之后,“底部”是左右之间空间的底部,而不是整个窗口的底部。

以下是pack 工作原理的规范描述:

http://tcl.tk/man/tcl8.5/TkCmd/pack.htm#M26

【讨论】:

  • 这是解决问题的为什么部分的唯一答案。感谢那。这是否意味着当空间不足时,小部件只是不显示
  • 这是不正确的(我知道我可以通过添加图像在我的问题中更清楚,但我无法让图像工作)。两个框架的宽度都是 1920,它们的高度是 730,这意味着仍然有一个宽度为 1920 和高度为 350 的空间(蓝框为 150,绿框为 200)。 TLDR:框架的放置适合 1920x1080 的窗口。请参阅@Carwley 的答案。这就是我一直在寻找的答案。
  • @Nae:正确,如果没有足够的空间,小部件可能会不可见,如本例所示。
  • @Fake:不,这不是错误的。我可以肯定地说。在这个例子中使用pack的方式,框架放置在左侧和右侧之间。即使有问题的框架放置在底部,它也是 available 空间的底部,而不是整个窗口的底部。正如我所建议的,删除对geometry 的调用,框架将出现在左右两侧之间。你没有问如何让它出现在窗口底部,你只是问为什么它没有出现。
  • @Fake:我已经更新了我的答案以提供更好的解释,并且如果您的目标是让底部框架位于窗口的最底部,则显示一个非常简单的解决方案。跨度>
【解决方案2】:

我认为问题在于您使用的是包边,因此中间没有一行。解决此问题的一种方法是创建一个MiddleFrame,其中使用了包装边,然后只包装其他框架。

import tkinter 
from tkinter import *

root = tkinter.Tk()
root.geometry("1920x1080")

TopFrame = Frame(root, width=1920, height=200, bg= "green")
TopFrame.pack()

#the middle frame
MiddleFrame = Frame(root)

#pack the two middle frames into the frame created above
#the parent of the two middle frames change to become MiddleFrame instead of root
MiddleRightFrame = Frame(MiddleFrame, width=1120, height=730, bg="orange")
MiddleRightFrame.pack(side=RIGHT)

MiddleLeftFrame = Frame(MiddleFrame, width=800, height=730, bg="black")
MiddleLeftFrame.pack(side=RIGHT)

#pack the middle frame with both frames inside it
MiddleFrame.pack()

BottomFrame = Frame(root, width=1920, height=150, bg="blue")
BottomFrame.pack()

【讨论】:

    【解决方案3】:

    添加:

    tkinter.mainloop()
    

    以便 GUI 开始等待事件,而不是跳过自行关闭。


    此外,pack 使用动态计算填充空白空间的填充算法。您不应该真的这样做,但在这种特定情况下,一个简单的调用交换就足够了。调用:

    BottomFrame.pack(side=BOTTOM)
    

    正好在TopFrame的包之后:

    TopFrame.pack(side=TOP)
    BottomFrame.pack(side=BOTTOM)
    MiddleRightFrame.pack(side=RIGHT)
    MiddleLeftFrame.pack(side=LEFT)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多