为什么我的框架包不会python3 tkinter

问题描述 投票:0回答:3

当我运行下面的代码时,我没有收到错误,但是底部框架没有出现在窗口中,请告诉我为什么以及如何使它出现(请使用包方法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)
python python-3.x tkinter
3个回答
0
投票

我认为问题是你正在使用包边,以便在中间有一条线。解决这个问题的一种方法是创建一个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()

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


0
投票

加:

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)
© www.soinside.com 2019 - 2024. All rights reserved.