Размер tkinter.Toplevel автоматически соответствует его виджетам - PullRequest
1 голос
/ 01 июля 2019

Я создал свой пользовательский класс инфобокса InfoBox, который я использую в своем приложении.tk.messagebox.showinfo не соответствовал моим потребностям в плохой форме.Но InfoBox не регулирует его размер, чтобы соответствовать виджетам, которые я размещаю внутри.Как сделать его как можно меньшим, не обрезая виджеты?

Класс получает строку msg и объект PhotoImage image, которые помещаются в InfoBox.Я добавил скриншот одного такого InfoBox.

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)

enter image description here

1 Ответ

2 голосов
/ 01 июля 2019

Как упоминал @kevin, он работает как задумано, textwidget в основном пуст и занимает большую пустую область, это то, что заставляет вас думать, что менеджер геометрии не сжимает окно для виджетов.

this:

(я удалил изображения и шрифты, которые не были предоставлены, и ненужные)

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 width и height позволяют настроить размер (в виде количества символов или строк) текстового виджета

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...