Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 19, 2017 17:06:11

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

tkinter + wait_variable = приехали

4kpt_V
По существу…
А, так Вы модуль целиком имели в виду. Ну, естественно, там не все гладко. Он слишком большой, чтобы его за раз нормально переписать. А я имел в виду то, что было процитировано.
4kpt_V
Зачем переименовывать существующие методы?
Ну это типа alias. Мне хочется иметь одинаковые названия для схожих методов для разных виджетов, например, одинаковые show и close для Tk, Toplevel, Text и пр. Что касается Root, то да, это alias целиком. Ну а другие - Top, TextBox, Entry еще снабжены всякими примочками по умолчанию. Это чтобы километры простыней не писать. Я просто вызову TextBox, а в нем будут уже и скроллбары, и кнопки (если нужно), и даже проверка правописания.
4kpt_V
Вас эта часть кода не смущает?
Это торчат уши старого кода, который я писал еще до того, как выучил классы. Оставлено для совместимости. Будет время - дойду и до него.
4kpt_V
При этом Вы не хотите их destro'ить, а хотите… Короче. Реально не понятно. Давайте, может, в картинках.
OK. Допустим, есть сложный виджет: Toplevel, на нем сидят 2 TextBox. В 1-м - английский текст (TextBox только для чтения), во 2-м текста нет (TextBox с возможностью правки). Определенная фраза, найденная в 1-м TextBox, выделяется определенным цветом. Во 2-м пользователь вводит перевод этой фразы. Когда он закончил перевод фразы, он нажимает кнопку или хоткей. Кнопка или хоткей вызывают обновление виджета, программа выдает следующую фразу на перевод. Естественно, всего может быть задумано не 2 TextBox, а больше, что еще больше усложнит интерфейс.

Итак, что произойдет при разрушении окна и повторном его создании (так организована моя старая версия), когда необходимо ввести перевод новой фразы?
1. GUI будет перерисован. Это заметно, пусть оно займет 0,5 с, но это заметно и мерцание раздражает.
2. Надо будет восстановить выделение в 1-м TextBox, а также прокрутить экран до того уровня, чтобы выделение было видно.
3. Если пользователь ошибся с переводом, надо восстановить тот текст, что он ввел, и установить курсор туда, где он был.
4. Все виджеты надо будет перепаковать.
5. Если пользователь изменил размеры окна, то нужно восстановить геометрию Toplevel.
Короче, много мороки, неприятные эффекты перерисовки. А если я вызываю тот же сложный виджет повторно?
1. GUI в целом не перерисовывается, отображается мгновенно.
2. Надо будет установить новое выделение при переводе новой фразы, но это требует очень мало времени, пользователя мерцание не раздражает.
3. Если пользователь ошибся с переводом, то восстанавливать текст и позицию курсора не надо - они уже в виджете.
Как-то так.

Офлайн

#2 Фев. 19, 2017 22:47:23

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

tkinter + wait_variable = приехали

Подождите. Т.е. вы задачу переходов внутри виджетов решаете их скрытием/закрытием с реиспользованием?

Офлайн

#3 Фев. 19, 2017 23:50:13

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

tkinter + wait_variable = приехали

4kpt_V
Подождите. Т.е. вы задачу переходов внутри виджетов решаете их скрытием/закрытием с реиспользованием?
Если вы имеете в виду переход с одного виджета на другой, то да. Я стараюсь заранее создать виджеты, так чтобы они отличались только шапкой, текстом и т.п., т.е. чтобы можно было не перепаковывать. Разумеется, если между виджетами есть серьезные отличия, то я их считаю разнотипными, создаю заранее и использую повторно. Единственное окно, которое я разрушаю - это root (непосредственно перед выходом).

Отредактировано vanvanov (Фев. 19, 2017 23:51:20)

Офлайн

#4 Фев. 20, 2017 01:31:56

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

tkinter + wait_variable = приехали

нет. Я имею ввиду переходы по тексту. Выделения и т.п. вы решаете перезагрузкой окон?

Офлайн

#5 Фев. 20, 2017 07:39:21

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

tkinter + wait_variable = приехали

4kpt_V
нет. Я имею ввиду переходы по тексту. Выделения и т.п. вы решаете перезагрузкой окон?
При переходе в пределах одного виджета его перезагрузка не требуется. Происходит обращение к классу с логикой, затем виджет обновляется. Пример:

 #!/usr/bin/python3
from sharedGUI import Widgets, Top, TextBox, create_binding, Geometry
class Data:
	
	def __init__(self):
		self.i = 0
		self.maxi = 6
		self.data = []
		self.create()
		
	def create(self):
		for i in range(self.maxi):
			self.data.append('Text %d' % i)
	
	def add(self):
		if self.i >= 0 and self.i < self.maxi - 1:
			self.i += 1
		else:
			self.i = 0
	
	def get(self):
		return self.data[self.i]
		
class SuperWidget: # Требует 'data', 'widgets' в качестве глобальных переменных
	
	def __init__(self):
		self.parent_obj = Top(parent_obj=widgets.root())
		Geometry(parent_obj=self.parent_obj).set('400x300')
		self.obj = TextBox(parent_obj=self.parent_obj,Composite=True)
		self.obj.focus()
		self.widget = self.obj.widget
		create_binding(widget=self.widget,bindings=['<Return>','<KP_Enter>'],action=self.update)
		self.reset()
		
	def show(self,*args):
		self.obj.show()
	
	def reset(self):
		self.obj.clear_text()
		self.obj.insert(text=data.get())
		self.obj.title(text=data.get())
	
	def update(self,*args):
		data.add()
		self.reset()
if __name__ == '__main__':
	widgets = Widgets()
	widgets.start()
	data = Data()
	SuperWidget().show()
	widgets.end()

Офлайн

#6 Фев. 20, 2017 13:01:19

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

tkinter + wait_variable = приехали

Честно. Я просто не пойму вопроса. Помочь в этом случае мне нечем… Честно. Я пытался

Офлайн

#7 Фев. 20, 2017 16:42:11

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

tkinter + wait_variable = приехали

4kpt_V
Честно. Я просто не пойму вопроса.
В этом случае код зависает на этапе wait_variable.
Код приведен в 1-м сообщении.

Офлайн

#8 Фев. 24, 2017 22:32:08

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

tkinter + wait_variable = приехали

Короче, выяснилось, что

 h_widgets = Widgets()
должен быть в
 if __name__ == '__main__':

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version