Найти - Пользователи
Полная версия: Уникальные имена виджетов. Как избавиться от этого?
Начало » GUI » Уникальные имена виджетов. Как избавиться от этого?
1
DHT
Пусть на новом окне создается виджет 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'
т.е. выходит, что нужно давать каждому виджету уникальное имя, что может привести к образованию очень длинных имен виджетов.
Можно ли как-то создавать новые окна и виджеты на них, чтобы потом обращаться к виджетам следующим образом:
"ИМЯ_ОКНА.ИМЯ_ВИДЖЕТА"
?
Griffon
Пробовали использовать параметр textvariable и переменную StringVar?
egg = StringVar()
Label(…, textvariable=egg, …)
Label(…, textvariable=egg, …)
egg.set(new_text)
Griffon
Это если вам надо менять одновременно оба.
А если вам надо красивый доступ, то определяйте окна классами наследованными от Frame.
DHT
Griffon
А если вам надо красивый доступ
Все верно. Нужен именно красивый доступ и красивая организации виджетов.

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

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

Подскажите как правильно или покажите пример, или подкиньте ссылку на опенсорс скрипт где это точно есть.
Спасибо.
Griffon
Вообще я погорячился.
Для красивых имён достаточно:
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'
И не забывайте давать второму окну уникальное имя, а то в вашем примере вторая функция использует те же переменные.
DHT
Griffon, спасибо.
Такой вараинт уже предложил друг в аське, но в нем есть недостаток: имена функции в каждом окне должны быть по прежнему уникальными да и довольно громоздкой может оказаться запись: self.ИМЯ_ОКНА.ИМЯ_ВИДЖЕТА.
Griffon
Тогда пишите окна как классы, а не как функции.
class window1(Toplevel):
def __init__(self, master=None):
Toplevel.__init__(self, master)
# Дальше пошли виджеты.
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