TkInter:无法用另一个小部件填充框架

时间:2016-10-08 03:21:23

标签: python tkinter

第一次使用TkInter。根据我读过的内容,您可以使用Frame小部件来保存其他小部件。所以,我放下了一些预览框架:

import tkinter as tk


root = tk.Tk()

TextFrame = tk.Frame(root, width=200, height=600, bg="red")
TextFrame.pack(side="left")

ListFrame = tk.Frame(root, width=800, height=600, bg="blue")
ListFrame.pack(side="right")

但是,当我添加一个小部件并告诉它填充框架时,它只是替换框架而不是扩展以填充区域。使用的测试代码:

ListBox = tk.Listbox(ListFrame, selectmode="single", bg="#545454", fg="#d9d9d9")
for X in range(20):
    ListBox.insert('end', X)
ListBox.pack(fill='both', expand=True)

如果我将父级设置为主“root”对象,则相同的测试代码会正确扩展。例如:

import tkinter as tk


root = tk.Tk()
root.geometry("1000x600")

ListBox = tk.Listbox(root, selectmode="single", bg="#545454", fg="#d9d9d9")
for X in range(20):
    ListBox.insert('end', X)
ListBox.pack(side="right", fill='both', expand=True)

TextBox = tk.Message(root, text="A bunch of text", width=100)
TextBox.pack(side="left", fill="y")

我做错了什么,这里?

2 个答案:

答案 0 :(得分:0)

框架就像弹性体,它们抓住它们的内容。 你可以添加:

ListFrame.pack_propagate(False)

关闭该行为

答案 1 :(得分:0)

不可能说出正确答案是什么,因为你的问题并没有准确解释你想要达到的外观和行为。

默认情况下,窗口小部件缩小或展开以适合其内容。 99.9%的时间这是正确的事情,并允许对响应非常敏感的UI(不同的字体,不同的分辨率,不同的窗口大小等)。在您的情况下,列表框不会替换框架。相反,框架只是缩小以适应列表框。

这样做是因为你没有告诉它做任何不同的事情。当您将框架放在根窗口中时,您没有告诉tkinter您希望框架填满窗口。你只是让它漂浮在顶部,这使它可以自由地增长或缩小以适应其内容。

通过为TextFrame.pack(side="left")提供适当的属性,您可以让该框架填充窗口,从而防止它缩小以适合其子项。

TextFrame.pack(side="left". fill="both", expand=True)

当然,假设您希望框架(以及它包含的文本小部件)填充窗口。如果您在其周围放置其他窗口,则可能会更改您要使用的选项。