tkinter.Toplevel大小自动适合其小部件

时间:2019-07-01 14:35:34

标签: python tkinter

我已经在应用程序中使用了自己的自定义信息框类tk.messagebox.showinfoInfoBox不适合我的需要,以适应恶劣的环境。但是msg不能调整其大小以适合我放入的小部件。如何在不切割小部件的情况下使其尽可能小?

该类接收一个字符串image和一个PhotoImage对象class InfoBox(tk.Toplevel): def __init__(self, parent, msg, image): tk.Toplevel.__init__(self, parent) self.parent = parent self.msg = msg self.image = image self.title = "Gassy" self.font = font.Font(family="Optima", size=20) frame_left = tk.Frame(self) frame_right = tk.Frame(self) frame_left.grid(row=0, column=0, sticky=tk.NSEW) frame_right.grid(row=0, column=1, sticky=tk.NSEW) tk.Label(frame_left, image=self.image).grid(row=0, column=0, sticky=tk.N) textbox = tk.Text(frame_right, font=self.font) textbox.grid(row=0, column=0) textbox.insert(tk.END, self.msg) textbox.config(state=tk.DISABLED) tk.Button(frame_left, text="Den er grei!", font=self.font, command=self.destroy).grid(row=1, column=0) ,它们放置在InfoBox中。我添加了一个这样的InfoBox的屏幕截图。

Item1
Item2
Item3
...

enter image description here

1 个答案:

答案 0 :(得分:2)

正如@kevin所提到的,它可以按预期工作,textwidget大部分是空的,并且占据了很大的空白区域,这就是让您认为几何图形管理器没有将窗口缩小到小部件的原因。

此:

(我删除了没有提供的图像和字体,并且没有必要)

import tkinter as tk

class InfoBox(tk.Toplevel):
    def __init__(self, parent, msg):
        tk.Toplevel.__init__(self, parent)
        self.parent = parent
        self.msg = msg

        self.title = "Gassy"

        frame_left = tk.Frame(self)
        frame_right = tk.Frame(self)
        frame_left.grid(row=0, column=0, sticky=tk.NSEW)
        frame_right.grid(row=0, column=1, sticky=tk.NSEW)

#         textbox = tk.Text(frame_right) 
#         textbox.grid(row=0, column=0)
#         textbox.insert(tk.END, self.msg)
#         textbox.config(state=tk.DISABLED)

        tk.Button(frame_left, text="Den er grei!", command=self.destroy).grid(row=1, column=0)

root = tk.Tk()
info = InfoBox(root, '123 ' * 1000)
root.mainloop()

产生:

enter image description here

而:

import tkinter as tk

class InfoBox(tk.Toplevel):
    def __init__(self, parent, msg):
        tk.Toplevel.__init__(self, parent)
        self.parent = parent
        self.msg = msg

        self.title = "Gassy"

        frame_left = tk.Frame(self)
        frame_right = tk.Frame(self)
        frame_left.grid(row=0, column=0, sticky=tk.NSEW)
        frame_right.grid(row=0, column=1, sticky=tk.NSEW)

        textbox = tk.Text(frame_right) 
        textbox.grid(row=0, column=0)
        textbox.insert(tk.END, self.msg)
        textbox.config(state=tk.DISABLED)

        tk.Button(frame_left, text="Den er grei!", command=self.destroy).grid(row=1, column=0)

root = tk.Tk()
info = InfoBox(root, '123 ' * 1000)
root.mainloop()

产生此:

enter image description here

很明显,Toplevel子类将其大小调整为包含的小部件

测试窗口小部件以一定大小显示,而不管其内容如何。 Toplevel会根据窗口小部件的大小进行调整,而不是根据文本窗口小部件中插入的内容进行调整;就像使用文本处理器基本窗口一样,在键入或编辑文本时,文本处理器不会缩小或扩展。这里也一样。
关键字args widthheight允许配置文本窗口小部件的大小(以字符数或行数表示)