tkinter - изменение размера пустой рамки - PullRequest
0 голосов
/ 18 марта 2019

Как вы заставляете фрейм получить window_height 0?

общий случай, когда моя проблема возникает:

import Tkinter as Tk

class App(Tk.Frame):
    def __init__(self, master):
        Tk.Frame(self, master)
        self.place_holder = Tk.Frame(master=self)
        self.content = Tk.Frame(master=self)

        self.place_holder.pack()
        self.content.pack(side=Tk.RIGHT)

        Tk.Button(master=self,command=self.add_something).pack(side=Tk.TOP)
        self.to_destroy = []

    def add_something(self):
        foo = Tk.button(master=self.place_holder, command=self.destroy_last)
        self.too_destroy.append(foo)

    def destroy_last(self):
        self.to_destroy[-1].destroy()

проблема:

Как я добавляю большеэлементы в place_holder, он хорошо масштабируется.

Когда я удаляю элементы из place_holder, он отлично масштабируется. ИСКЛЮЧИТЬ , когда я удаляю последний элемент.

Прежде чем я добавлю что-либо, даже если я сделаю place_holder.pack(), он не будет отображаться.Но после удаления последнего элемента place_holder сохранит размер этого последнего элемента.Есть ли способ скрыть place_holder снова, пока я снова не добавлю содержимое?

пример изображения

empty place_holder at bottom left Пустой контейнер в левом нижнем углу не содержиткакие-либо элементы, но размер последнего элемента в них все еще есть, как я могу заставить это исчезнуть, не удаляя его (я хочу, чтобы оно снова было в том же месте)?

1 Ответ

2 голосов
/ 19 марта 2019

Происходит следующее: при удалении последнего виджета pack больше не управляет фреймом, поэтому он не отвечает за установку размера фрейма.

Самое простое решение - просто временно упаковать кадр размером 1x1 пикселя, что приведет к сжатию кадра заполнителя.

Нет способа создать кадр с нулевыми пикселями, поэтому этот метод всегда будет иметь область пикселя высотой / шириной в один пиксель для заполнителя. Если вам не нужен этот один пиксель, вы можете установить вызов pack_forget на заполнитель, чтобы полностью удалить его с дисплея, а затем использовать pack с подходящими параметрами, чтобы добавить его снова, когда вы что-то добавите в него.

Пример:

def destroy_last(self):
    self.to_destroy.pop().destroy()
    if len(self.to_destroy) == 0:
        tmp = Tk.Frame(self.place_holder, width=1, height=1, borderwidth=0)
        tmp.pack()
        self.place_holder.update()
        tmp.destroy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...