Как заставить виджет кнопки отображать текст и цвет после нажатия - PullRequest
0 голосов
/ 21 ноября 2018

Итак, у меня есть виджет кнопки, и я хочу, чтобы он отображал текст и цвет виджета после нажатия.Я не могу использовать метод .cget, чтобы сделать это, так как в цикле создано несколько кнопок с одинаковыми именами, поэтому он просто даст текст и цвет последнего созданного виджета кнопки.Старайтесь не использовать сложные методы и сделайте это как можно проще.

for x in range(5):
    for y in range(10):

        if x == 0:
            x_row = 'A'
        elif x == 1:
            x_row = 'B'
        elif x == 2:
            x_row = 'C'
        elif x == 3:
            x_row = 'D'
        elif x == 4:
            x_row = 'E'

        seats_button = tkinter.Button(windowmain, text = '%s' % (str(x_row)+str(y+1)), command = lambda: messagebox.showinfo('Testing',seats_button.cget('text')),font=customFont) # Says E10 as it was the last created widget
        seats_button.grid(row = x, column = y)

        if str(x_row)+str(y+1) in available[0] or str(x_row)+str(y+1) in available[1] or str(x_row)+str(y+1) in available[2] or str(x_row)+str(y+1) in available[3] or str(x_row)+str(y+1) in available[4]:
            seats_button["background"] = 'green'

Как мне исправить это?Спасибо!

Полный код: https://pastebin.com/awQ50bp3

1 Ответ

0 голосов
/ 21 ноября 2018

Используйте lambda со строковым аргументом для кнопки command и установите значение по умолчанию строкового аргумента для текста кнопки:

btnText = '%s' % (str(x_row)+str(y+1))
seats_button = tkinter.Button(windowmain, text = btnText, command = lambda s=btnText: messagebox.showinfo('Testing',s),font=customFont)

Это потому, что значение по умолчанию создается при определенииlambda.

Предложение по изменению цвета сиденья в зависимости от вашего кода:

Изменить btn_list с местного array на глобальныйdictionary используя btnText в качестве ключа:

btn_list = {}   # defined in global area and replaced the line btn_list = [] inside function bookinginterface()
...
btn_list[btnText] = seats_button   # replaced the line btn_list.append(seats_button)

Определить новую функцию, которая будет вызываться лямбда-выражением:

def seat_selected(seatName):
    messagebox.showinfo('Testing', seatName)
    btn_list[seatName]["background"] = "whatever color you want"
    # do other stuff you want
    ...

...

seats_button = tkinter.Button(windowmain, text=btnText, command=lambda s=btnText: seat_selected(s), font=customFont)
...