Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么赢了';t我的框架包蟒蛇3 tkinter_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 为什么赢了';t我的框架包蟒蛇3 tkinter

Python 为什么赢了';t我的框架包蟒蛇3 tkinter,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,当我运行下面的代码时,我没有收到错误,但是底部框架没有出现在窗口中。请告诉我为什么以及如何显示它(请使用pack方法而不是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=T

当我运行下面的代码时,我没有收到错误,但是底部框架没有出现在窗口中。请告诉我为什么以及如何显示它(请使用pack方法而不是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开始等待事件,而不是跳过关闭自己


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

BottomFrame.pack(side=BOTTOM)
正好在
顶框
的包装之后:

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

我认为问题是你使用的是包边,所以中间有一条空线。解决这个问题的一种方法是创建一个
中间帧
,其中使用了包边,然后只打包其他帧

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()

您的
middleftframe
宽800像素。您的
MiddleRightFrame
为1120像素。1120 + 800 = 1920. 您强制窗口仅为1920像素宽,因此没有空间放置蓝色边框

删除这一行,您的框架将显示:
root.geometry(“1920x1080”)

如果您希望它显示在窗口底部,跨越窗口的整个宽度,则在调用左右两侧的
pack
之前,先对其调用
pack

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

这种方法之所以有效,是因为packer算法。当你把某物放在左边或右边时,它会在那一边分配所有剩余的垂直空间。因此,在你把东西放在左边和右边,然后再把东西放在底部之后,“底部”是左边和右边之间空间的底部,而不是整个窗口的底部

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


有许多方法可以让您的蓝色边框可见。为您想要的图形用户界面提供图像。您确实意识到,当框架包含其他内容时,框架会很快缩小或扩大,对吗?是的,我将使按钮与框架的大小完全相同。我将使用8个大小均匀的按钮,每个按钮高度150,宽度240。我认为您强制采用一种过于直接的方式来生成图形用户界面,这不必要地使事情复杂化了。我认为
place
优于网格或包。当你说“让它出现”时,你希望它出现在哪里?按照您的编码方式,如果有空间,它将显示在左帧和右帧之间。你想让它出现在窗口的最底部,横跨整个窗口吗?这是唯一一个解决问题的为什么部分的答案。谢谢你。这是否意味着当没有足够的空间时,小部件就不会显示?这是不正确的(我知道我可以通过添加图像来更清楚地回答我的问题,但是我无法使图像正常工作)。两个框架的宽度均为1920,高度均为730,这意味着仍然存在宽度为1920,高度为350的空间(蓝色框架为150,绿色框架为200)。TLDR:框架的放置适合1920x1080窗口。请参见@Carwley的答案。这就是我一直在寻找的答案。@Nae:正确,如果没有足够的空间放置小部件,它们可能不可见,如本例所示。@Fake:不,这不正确。我可以肯定地说。本例中使用了
pack
的方式,框架放置在左侧和右侧之间。尽管有问题的框架被放置在底部,但它是可用空间的底部,而不是整个窗口的底部。正如我所建议的,取消对
几何体的调用
,框架将出现在左侧和右侧之间。你没有问如何让它显示在窗口底部,你只是问为什么它没有显示。@Fake:我更新了我的答案,以提供更好的解释,并显示一个非常简单的解决方案,如果你的目标是让底部框架位于窗口的最底部。
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()
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()