Как программно связать одну и ту же операцию с набором кнопок в tkinter?

Я работаю над проектом Python/Tkinter, для которого требуются программно созданные кнопки из списка, как показано ниже.

Когда нажата определенная кнопка, я хотел бы, чтобы эта кнопка стала "sunken", пока не будет нажата другая кнопка, на этом этапе эта кнопка станет "sunken", а кнопка, на которую нажали первой, станет 'normal'.

Пока я не могу понять, как это сделать, не кодируя каждую кнопку по отдельности.

В идеале relief должен быть установлен в функции press().

import tkinter


window = tkinter.Tk()
window.title("Practice UI")
window.grid()

numbers = ["1","2","3","4","5","6","7","8","9"]

def buttonCreator(labels):
    n = 0
    button = []
    for x in range(0,3):
        for y in range(0,3):
            if n<=len(labels)-1:
                button.append(tkinter.Button(window, text = labels[n], command = lambda x = labels[n]:press(x)))
                button[n].grid(row = x, column = y)
            n +=1

def press(value):
    print(value)

buttonCreator(numbers)

window.mainloop()

person Nic Steyn    schedule 19.07.2015    source источник
comment
С чем у вас проблемы? Похоже, вы можете создавать кнопки и связывать команду с каждой кнопкой. Что ты не умеешь делать? Вы знаете о методе config для виджетов кнопок?   -  person Bryan Oakley    schedule 19.07.2015
comment
Извините, я был неясен. После нажатия я бы хотел, чтобы нажатая кнопка стала «затонувшей». Затем я хотел бы, чтобы кнопка возвращалась в состояние по умолчанию «нормальное» после нажатия следующей кнопки. Я не могу понять, как использовать метод конфигурации позже, поскольку отдельные кнопки не имеют меток?   -  person Nic Steyn    schedule 19.07.2015


Ответы (3)


Вы можете просто вернуть button и использовать его для доступа к своим кнопкам в press():

import tkinter

window = tkinter.Tk()
window.grid()

# changed to integers so we can loop through the
# values in press() and use them as indices
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

def buttonCreator(labels):
    n = 0
    button = []
    for x in range(0, 3):
        for y in range(0, 3):
            if n <= len(labels) - 1:
                button.append(tkinter.Button(window, text=labels[n],
                                             command=lambda x=labels[n]:press(x)))
                button[n].grid(row=x, column=y)
            n += 1
    return button # added a return statement

def press(value):
    for x in numbers:
        # index is x-1 because 1 is in button[0], etc
        button[x-1]['relief'] = 'sunken' if x == value else 'raised'

button = buttonCreator(numbers)
window.mainloop()
person fenceop    schedule 20.07.2015

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

Для удобства радиокнопки имеют атрибут indicatoron, который

Обычно радиокнопка отображает свой индикатор. Если вы установите этот параметр равным нулю, индикатор исчезнет, ​​и весь виджет станет кнопкой «нажми-нажми», которая выглядит приподнятой, когда она очищается, и утопленной, когда она установлена. Вы можете увеличить значение borderwidth, чтобы было легче видеть состояние такого элемента управления.

таким образом, при нулевом значении он делает точно то, что вы запрашиваете.

person msw    schedule 19.07.2015

Просто для примера я создам две кнопки с нужной вам реакцией:

from Tkinter import *

win = Tk()

def press1():
    button1["relief"] = "sunken"
    button2["relief"] = "normal"
def press2():
    button1["relief"] = "normal"
    button2["relief"] = "sunken"

button1 = Button(win, text="Button 1", command=press1)
button2 = Button(win, text="Button 2", command=press2)

button1.pack()
button2.pack()

button1.grid(row=1, column=1)
button2.grid(row=1, column=2)

win.mainloop()

Должно сработать. Второй способ:

from Tkinter import *

win = Tk()

def press(buttonnumber):
    if buttonnumber==1:
        button1["relief"] = "sunken"
        button2["relief"] = "normal"
    elif buttonnumber==2:
        button1["relief"] = "normal"
        button2["relief"] = "sunken"
    else: 
        raise Exception("No Button Number \"%d\"" % buttonnumber)

button1 = Button(win, text="Button 1", command=lambda: press(1))
button2 = Button(win, text="Button 2", command=lambda: press(2))

button1.pack()
button2.pack()

button1.grid(row=1, column=1)
button2.grid(row=1, column=2)

win.mainloop()
person dccsillag    schedule 20.07.2015