2016-10-31 3 views
1

Я начал программировать простое графическое приложение в Python, используя библиотеку Tkinter. Все работает отлично, но для динамического изменения любого виджета (например, от кнопки «login» до «logout» и т. Д.) Мне нужно получить переменную, содержащую сам объект виджета в функции извне. Я могу сделать это двумя способами:Python 3 и Tkinter. Слишком много глобальных переменных

  1. Передача виджета в качестве аргумента;
  2. с использованием глобальных переменных.

Упрощенный пример:

1) Passing в качестве аргумента:

def changeLabel(b): 
    b.config(text='Logout') 

btn1 = Button(f0,text="Login",width=15) 
btn1.grid(row=1,column=2,rowspan=1,padx=10,ipadx=10) 
changeLabel(btn1) 

2) или с помощью глобальной переменной:

def changeLabel(): 
    global btn1 
    btn1.config(text='Logout') 

btn1 = Button(f0,text="Login",width=15) 
btn1.grid(row=1,column=2,rowspan=1,padx=10,ipadx=10) 
changeLabel(btn1) 

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

Итак, как лучше всего управлять виджетами Tkinter во время выполнения? Можете ли вы предложить мне правильный путь? Спасибо

+1

Не можете вы просто не имеют 'функцию changeLabel' на всех, и сделать' btn1.config (текст = "Выход") 'inline? Кстати, утверждение 'global' не требуется в подходе # 2, потому что вы не присваиваете ничего' btn1'. – Kevin

+1

Третьим вариантом является использование классов, в которых виджет является атрибутом класса. –

+0

Мой пример является добровольным упрощена, в моем приложении мне нужно: - скрыть кнопку и показать еще один - текст изменения каждый клик - скрыть/показать кадры - и так далее ... – decadenza

ответ

4

Лучший способ управлять виджетами tkinter во время выполнения - хранить эти виджеты в качестве атрибутов класса.

Например:

class Example(...): 
    def create_widgets(self): 
     ... 
     self.btn1 = Button(...) 
     ... 
    def changeLabel(self): 
     self.bt1.config(...) 

Для получения дополнительной информации см Best way to structure a tkinter application

Смежные вопросы