Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Уникальные имена виджетов. Как избавиться от этого? [RSS Feed]

#1 Ноя. 16, 2009 19:13:56

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Уникальные имена виджетов. Как избавиться от этого?

Пусть на новом окне создается виджет Label:

def window_1(self):
self.toplevel = Toplevel(root)
self.note = Label(self.toplevel)
self.note['text'] = '1'
А на втором окне создается такой же виджет и с тем же именем:
def window_2(self):
self.toplevel = Toplevel(root)
self.note = Label(self.toplevel)
self.note['text'] = '2'
Теперь если отобразить эти два окна и изменить значение свойства text виджета self.note, то изменения коснутся только виджета на 2-м окне.
self.window_1()
self.window_2()
self.note['text'] = '3'
т.е. выходит, что нужно давать каждому виджету уникальное имя, что может привести к образованию очень длинных имен виджетов.
Можно ли как-то создавать новые окна и виджеты на них, чтобы потом обращаться к виджетам следующим образом:
"ИМЯ_ОКНА.ИМЯ_ВИДЖЕТА"
?



Офлайн

#2 Ноя. 16, 2009 22:37:30

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Уникальные имена виджетов. Как избавиться от этого?

Пробовали использовать параметр textvariable и переменную StringVar?
egg = StringVar()
Label(…, textvariable=egg, …)
Label(…, textvariable=egg, …)
egg.set(new_text)



Офлайн

#3 Ноя. 16, 2009 22:40:08

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Уникальные имена виджетов. Как избавиться от этого?

Это если вам надо менять одновременно оба.
А если вам надо красивый доступ, то определяйте окна классами наследованными от Frame.



Отредактировано (Ноя. 16, 2009 22:40:41)

Офлайн

#4 Ноя. 16, 2009 23:24:00

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Уникальные имена виджетов. Как избавиться от этого?

Griffon
А если вам надо красивый доступ
Все верно. Нужен именно красивый доступ и красивая организации виджетов.

Griffon, можешь на небольшом примере? Буду очень признателен.



Офлайн

#5 Ноя. 17, 2009 16:14:56

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Уникальные имена виджетов. Как избавиться от этого?

Пробовал делать сам, вот что получается:
1) Есть класс главного окна class Application(Frame), в функции __init__ которого вызывается фукнкция рисования главного окна.
2) Его наследуют другие классы для новых окон class Window1(Application), class Window2(Application) в которых переписывается __init__, чтобы не создавать главное окно еще раз, а также вызываются функции рисования новых окон.

Проблема в том, что т.о. из класов Window1 и Window2 нет доступа к виджетам класса Application. Ну только если все виджеты изначально прописсать в __init__, т.е. сделать их свойством класса Application, что помоему не красиво.

Подскажите как правильно или покажите пример, или подкиньте ссылку на опенсорс скрипт где это точно есть.
Спасибо.



Отредактировано (Ноя. 17, 2009 16:15:41)

Офлайн

#6 Ноя. 17, 2009 18:17:44

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Уникальные имена виджетов. Как избавиться от этого?

Вообще я погорячился.
Для красивых имён достаточно:
self.F1 = Frame(self)
self.F1.F1 = Frame(self.F1)
self.F1.F1.F1 = Frame(self.F1.F1)

Ну и в таком духе.

То есть:

def window_1(self):
self.toplevel1 = Toplevel(root)
self.toplevel1.note = Label(self.toplevel1)
self.toplevel1.note['text'] = '1'
И не забывайте давать второму окну уникальное имя, а то в вашем примере вторая функция использует те же переменные.



Офлайн

#7 Ноя. 17, 2009 18:46:49

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Уникальные имена виджетов. Как избавиться от этого?

Griffon, спасибо.
Такой вараинт уже предложил друг в аське, но в нем есть недостаток: имена функции в каждом окне должны быть по прежнему уникальными да и довольно громоздкой может оказаться запись: self.ИМЯ_ОКНА.ИМЯ_ВИДЖЕТА.



Офлайн

#8 Ноя. 18, 2009 18:42:23

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Уникальные имена виджетов. Как избавиться от этого?

Тогда пишите окна как классы, а не как функции.

class window1(Toplevel):
def __init__(self, master=None):
Toplevel.__init__(self, master)
# Дальше пошли виджеты.



Офлайн

  • Начало
  • » GUI
  • » Уникальные имена виджетов. Как избавиться от этого?[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version