Виджеты Tkinter - как настроить более одного виджета одновременно? - PullRequest
0 голосов
/ 04 апреля 2020

Мой код запутался из-за множества операций по изменению состояния виджетов. Например, у меня есть около 8 кнопок, которые я хочу иметь fg = 'red', text = 'press to config', когда значение, назначенное их связанным переменным, равно None (до того, как пользователь сделает ввод). Также для некоторых из них я хочу чтобы сделать их состояние = «отключено», когда выполняются определенные условия, чтобы пользователь не мог делать какие-либо вводы. Есть ли простой способ сгруппировать их, а затем использовать одну команду? Что-то вроде:

for btn in btns_list:
    if btn connected variable is not None:
        btn.config(text='Press to reconfig', fg='green')

Это Похоже, что это может быть каким-то образом управляется с помощью словаря, я прав? Любые предложения приветствуются, потому что сейчас около 1/5 моего кода "весело" с изменением конфигурации виджетов, и когда проект становится больше, это не так просто управление.

1 Ответ

2 голосов
/ 04 апреля 2020

Вы уже используете простой способ. Вы можете запомнить идентификатор каждой кнопки по my_btn = Button(master, ...), где my_btn будет идентификатором кнопки. Затем соберите их в списке и используйте для l oop каждый раз, когда вы хотите вызвать все кнопки, добавленные вами, по их идентификатору. См .:

import tkinter as tk

button_list = []

master = tk.Tk()

def change_color():
    for button in button_list:
        button.config(bg='red')

my_btn = tk.Button(master, text="Button 1")
my_btn.pack()
button_list.append(my_btn)
my_btn = tk.Button(master, text="Button 2")
my_btn.pack()
button_list.append(my_btn)
my_btn = tk.Button(master, text="Button 3")
my_btn.pack()
button_list.append(my_btn)
my_btn = tk.Button(master, text="CHANGE COLOR", command=change_color)
my_btn.pack()


master.mainloop()

Вы можете использовать словарь вместо списка, чтобы выбрать нужную кнопку, это будет лучше.

Конечно, вы можете ссылаться на все кнопки, как в коде выше, но я не думаю, что вам это когда-нибудь понадобится.

Кстати, вам не нужно использовать is not None, потому что if btn connected variable уже возвращает вам логическое значение, поэтому ваш l oop должен выглядеть следующим образом:

for btn in btns_list:
    if btn connected variable:
        btn.config(text='Press to reconfig', fg='green')

РЕДАКТИРОВАТЬ 1:

Пример со словарем вместо списка:

import tkinter as tk

# dictionary with buttons
d = {} 
master = tk.Tk()

def change_color():
    # for loop for dict keys
    for button in d.keys():
        # here we refer to each button(value of button key)
        # and change the color
        #
        # here you can add some if statements to edit particular group
        # of buttons
        d[button].config(bg='red')

my_btn = tk.Button(master, text="Button 1")
my_btn.pack()
d['group1_btn_name1'] = my_btn
my_btn = tk.Button(master, text="Button 2")
my_btn.pack()
d['group2_btn_name2'] = my_btn
my_btn = tk.Button(master, text="Button 3")
my_btn.pack()
d['group1_btn_name3'] = my_btn
my_btn = tk.Button(master, text="CHANGE COLOR", command=change_color)
my_btn.pack()


master.mainloop()

Но помните - каждый ключ в словаре должен быть уникальным, поэтому названия кнопок (клавиш) должны быть разными (btn_name1, btn_name2, btn_name3). Вы можете сгруппировать их, добавив префиксы, такие как some_group_btn1, some_group_btn2 ... other_group_btnnnn...

Вы можете создавать кнопки и группы с любыми именами, но что-то (например, _) должно разделять префикс группы и имя кнопки для определения конкретных имен групп в словарных ключах. Например, вы можете добавить такой оператор if:

if 'group1' in button.split('_'):
    d[button].config(bg='red')

Это изменит кнопки, которые относятся только к группе group1. Но помните, что требуемый знак деления _ или - всегда должен быть одинаковым из-за операции разделения.

  1. Проверка ключей словаря здесь
  2. О расколе здесь
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...