Найти - Пользователи
Полная версия: Обновление интерфейса без полной перерисовки виджета
Начало » GUI » Обновление интерфейса без полной перерисовки виджета
1
vanvanov
Добрый день!

Я делаю интерфейс в Tkinter. У меня есть такая задача: сделать панель с кнопками сверху и несколько блоков с Text, Entry и некоторыми другими стандартными виджетами снизу. При этом я хочу, чтобы панель с кнопками была статичной, а фрейм снизу с указанными выше виджетами можно было бы обновить с другим количеством виджетов. При этом я не хочу полностью перерисовывать нижний фрейм. Если бы это был Toplevel, я бы мог просто использовать методы withdraw и deiconify, чтобы скрыть один фрейм и показать другой. Но Toplevel, насколько я понимаю, всегда рисуется как обособленное окно, а не часть виджета. Пожалуйста, предложите, как можно изменить Toplevel под данную задачу или что можно использовать вместо него.

Как вариант, есть методы lift и lower, для которых я использовал следующий код:
 #!/usr/bin/python3
import tkinter as tk
class SampleApp(tk.Tk):
	
	def __init__(self, *args, **kwargs):
		tk.Tk.__init__(self, *args, **kwargs)
		self.frame = tk.Frame(self)
		self.frame.pack(side="top", fill="both", expand=True)
		self.label = tk.Label(self, text="Hello, world")
		button1 = tk.Button(self, text="Click to hide label",command=self.hide_label)
		button2 = tk.Button(self, text="Click to show label",command=self.show_label)
		self.label.pack(in_=self.frame)
		button1.pack(in_=self.frame)
		button2.pack(in_=self.frame)
	def show_label(self, event=None):
		self.label.lift(self.frame)
	def hide_label(self, event=None):
		self.label.lower(self.frame)
if __name__ == "__main__":
	app = SampleApp()
	app.mainloop()
Его недостаток в том, что окно включает сразу все элементы и не подстраивается под размеры только тех элементов, которые на экране.

Как бы вы решили такую задачу?
4kpt_IV
Я делал фрейм и потом скрывал его, если это было необходимо. Т.е. фактически у меня был набор фреймов при нажатии на кнопку все скрывались, а один отображался.
vanvanov
4kpt_IV
Я делал фрейм и потом скрывал его, если это было необходимо. Т.е. фактически у меня был набор фреймов при нажатии на кнопку все скрывались, а один отображался.
Да, это то что нужно. Но какие методы используются для скрытия и отображения фрейма? withdraw/deiconify на нем не работают.
4kpt_IV
Зависит от метода упаковки этих фреймов. Каждый метод упаковки имеет собственный метод для сокрытия Каким пользуетесь Вы?
vanvanov
4kpt_IV
Зависит от метода упаковки этих фреймов. Каждый метод упаковки имеет собственный метод для сокрытия Каким пользуетесь Вы?
pack().
4kpt_IV
pack_forget()
vanvanov
4kpt_IV
pack_forget()
Да, действительно, спасибо. Я почему-то думал, что оно работает как destroy.
А как сделать так, чтобы фрейм подстраивался под размеры текущего виджета?
4kpt_IV
Он вообще должен автоматом подстраиваться под размеры внутренних виджетов. Не пойму вопроса.
vanvanov
4kpt_IV
Разобрался. У меня есть обертка для Tk, где в ненужном месте вызывалось update_idletasks, видимо, из-за чего фрейм и не менял размер.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB