Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Обновление интерфейса без полной перерисовки виджета [RSS Feed]

#1 Янв. 22, 2017 17:35:38

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Обновление интерфейса без полной перерисовки виджета

Добрый день!

Я делаю интерфейс в 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()
Его недостаток в том, что окно включает сразу все элементы и не подстраивается под размеры только тех элементов, которые на экране.

Как бы вы решили такую задачу?

Офлайн

#2 Янв. 22, 2017 18:03:36

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Обновление интерфейса без полной перерисовки виджета

Я делал фрейм и потом скрывал его, если это было необходимо. Т.е. фактически у меня был набор фреймов при нажатии на кнопку все скрывались, а один отображался.

Офлайн

#3 Янв. 22, 2017 18:23:23

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Обновление интерфейса без полной перерисовки виджета

4kpt_IV
Я делал фрейм и потом скрывал его, если это было необходимо. Т.е. фактически у меня был набор фреймов при нажатии на кнопку все скрывались, а один отображался.
Да, это то что нужно. Но какие методы используются для скрытия и отображения фрейма? withdraw/deiconify на нем не работают.

Офлайн

#4 Янв. 22, 2017 21:17:58

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Обновление интерфейса без полной перерисовки виджета

Зависит от метода упаковки этих фреймов. Каждый метод упаковки имеет собственный метод для сокрытия Каким пользуетесь Вы?

Офлайн

#5 Янв. 23, 2017 00:31:56

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Обновление интерфейса без полной перерисовки виджета

4kpt_IV
Зависит от метода упаковки этих фреймов. Каждый метод упаковки имеет собственный метод для сокрытия Каким пользуетесь Вы?
pack().

Офлайн

#6 Янв. 23, 2017 07:40:15

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Обновление интерфейса без полной перерисовки виджета

Офлайн

#7 Янв. 27, 2017 11:24:50

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Обновление интерфейса без полной перерисовки виджета

4kpt_IV
pack_forget()
Да, действительно, спасибо. Я почему-то думал, что оно работает как destroy.
А как сделать так, чтобы фрейм подстраивался под размеры текущего виджета?

Офлайн

#8 Янв. 27, 2017 11:32:39

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Обновление интерфейса без полной перерисовки виджета

Он вообще должен автоматом подстраиваться под размеры внутренних виджетов. Не пойму вопроса.

Офлайн

#9 Янв. 27, 2017 18:39:29

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Обновление интерфейса без полной перерисовки виджета

4kpt_IV
Разобрался. У меня есть обертка для Tk, где в ненужном месте вызывалось update_idletasks, видимо, из-за чего фрейм и не менял размер.

Офлайн

  • Начало
  • » GUI
  • » Обновление интерфейса без полной перерисовки виджета[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version