Повторная замена виджета на виджет одинакового размера - как это сделать? - PullRequest
1 голос
/ 12 марта 2020

В настоящее время я работаю на основе tkinter python gui, и в моей программе вы можете нажать кнопку, и тогда первый виджет станет невидимым, а другой не отобразится в той же позиции, что и первый один. После этого вы можете переключиться назад, и второй виджет исчезнет, ​​а первый будет в том же положении видимым и т. Д. ...

Моя цель состоит в том, чтобы два виджета получили одинаковый размер, если вы при переключении виджетов пользователь не увидит больше / меньше виджетов, но я не могу сказать, как мне туда добраться - можете ли вы мне помочь?

Мое окно tkinter:

self.window = tkinter.Tk()
self.window.resizable(True, True)
self.window.grid_rowconfigure(2, weight=1)
self.window.grid_columnconfigure(0, weight=2)
self.window.grid_columnconfigure(1, weight=1)

Моя рамка для двух виджетов:

contentFrame = tkinter.Frame(master=self.window, bg="#FFF", highlightthickness=0, borderwidth=0)
contentFrame.grid_rowconfigure(0, weight=1)
contentFrame.grid_columnconfigure(0, weight=1)
contentFrame.grid(column=0, row=2, padx=5, pady=5, sticky="nsew")

Мой первый виджет (красный):

canvas = tkinter.Canvas(master=contentFrame, bg="#F00", highlightthickness=0, borderwidth=0)
        canvas.pack(fill="both", expand=True)

Мой второй виджет (синий)

xmlEditor = tkinter.Text(master=contentFrame, bg="#00F", highlightthickness=0, borderwidth=0)

И что происходит, когда меняется с красного на синий:

self.window.children["!frame2"].children["!canvas"].pack_forget()
self.window.children["!frame2"].children["!text"].pack(fill="both", expand=True)

И что происходит, когда меняется с синего на красный:

self.window.children["!frame2"].children["!text"].pack_forget()
self.window.children["!frame2"].children["!canvas"].pack(fill="both", expand=True)

Посмотрите видео здесь чтобы увидеть проблему в действии:)

1 Ответ

0 голосов
/ 12 марта 2020

Что я хотел бы сделать, это использовать промежуточный кадр, который контролирует размер. Затем вы можете упаковать либо красную, либо синюю рамку внутри этой рамки.

Начните с создания подкадра нужного размера. Допустим, вы хотите, чтобы площадь была 500x500:

subframe = tk.Frame(contentFrame, width=500, height=500)
subframe.pack(fill="both", expand=True)

Затем отключите распространение геометрии, чтобы рамка не увеличивалась или не сжималась, чтобы соответствовать ее дочерним элементам:

subframe.pack_propagate(False)

Наконец поместите свои красные и синие рамки внутри этого подкадра:

canvas = tkinter.Canvas(master=subframe, bg="#F00", highlightthickness=0, borderwidth=0)
xmlEditor = tkinter.Text(master=subframe, bg="#00F", highlightthickness=0, borderwidth=0)
...