Является ли их grid_remember ()?Обратимая grid_forget ()? - PullRequest
0 голосов
/ 18 октября 2018

Я запутался в документации, связанной с tkinter "grid_forget ()". Я знаю, что эта функция не навсегда удаляет приписанный ей виджет, однако я не знаю, как вызвать его снова.Кроме того, если виджет забыт в кадре, можно ли его отозвать обратно в тот же кадр?

Большое спасибо Большое спасибо

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете вызвать grid() без параметров, чтобы отменить эффекты grid_remove().

В следующем примере есть метка, которая помещается в верхней части окна с помощью grid.Есть кнопка переключения, которая будет переключаться между вызовами grid и grid_remove, чтобы показать, что вызов grid без параметров восстановит сообщение в точности так, как оно было.

Обратите внимание, например, что оба атрибута row, column и columnspan запоминаются при повторном появлении сообщения.

import tkinter as tk

class Example():
    def __init__(self):
        self.root = tk.Tk()
        self.root.grid_rowconfigure(2, weight=1)
        self.root.grid_columnconfigure(1, weight=1)

        self.toolbar = tk.Frame(self.root)
        self.toggle = tk.Button(self.toolbar, text="Toggle the message",
                                command=self.toggle_message)
        self.toggle.pack(side="left")

        # simulate a typical app with a navigation area on the left and a main
        # working area on the right
        self.navpanel = tk.Frame(self.root, background="bisque", width=100, height=200)
        self.main = tk.Frame(self.root, background="white", width=300, height=200, bd=1, relief='sunken')
        self.message = tk.Label(self.root, text="Hello, world!")

        self.toolbar.grid(row=0, column=0, columnspan=2)
        self.message.grid(row=1, column=0, columnspan=2)
        self.navpanel.grid(row=2, column=0, sticky="nsew")
        self.main.grid(row=2, column=1, sticky="nsew")

    def start(self):
        self.root.mainloop()

    def toggle_message(self):
        if self.message.winfo_viewable():
            self.message.grid_remove()
        else:
            self.message.grid()

if __name__ == "__main__":
    Example().start()

Если вы измените код с помощьюgrid_remove для использования grid_forget, восстановление метки не вернет ее в то же место или с теми же параметрами.Это основное различие между grid_remove и grid_forget - grid_forget буквально забывает параметры сетки, тогда как grid_remove удаляет виджет, но запоминает настройки.

0 голосов
/ 18 октября 2018

Вот простой пример, чтобы проиллюстрировать, что происходит, когда вы удаляете виджет из сетки, а затем изменяете сетку.Вам просто нужно повторно применить сетку так же, как вы сделали бы в первую очередь.Вы можете даже выбрать другое расположение сетки, если хотите.Хотя я не уверен, что вы можете изменить контейнер, для которого он изначально был назначен.Если нет, то его можно будет только повторно добавить в исходный контейнер, которому был назначен виджет.

import tkinter as tk

root = tk.Tk()

some_label = tk.Label(root, text="IM HERE!")
some_label.grid(row=0, column=0, columnspan=2)

def forget_label():
    some_label.grid_forget()

def return_label():
    some_label.grid(row=0, column=0, columnspan=2)

tk.Button(root, text="Forget Label", command=forget_label).grid(row=1, column=0)
tk.Button(root, text="Return Label", command=return_label).grid(row=1, column=1)

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