Вопрос:

tkinter: лямбда несколько кнопок на метку?

python python-3.x tkinter lambda

133 просмотра

1 ответ

107 Репутация автора

Описание: Я хотел бы иметь возможность щелкнуть по кнопке, чтобы она отправляла свое значение в виджет метки, который является ( lab_1), я понимаю, что нужно сделать одну единственную кнопку, которую вам нужно использовать, command=lambda: lab_1.configure(text=0)но как вы будете печатать значения на метке, когда Я использовал forцикл для создания всех моих кнопок во встроенном списке. на данный момент все кнопки имеют переменную с именем key_press.

Упрощенные вопросы:

  • Как вы записываете все значения в мой ярлык ( lab_1)?

  • Как вы можете использовать forцикл, чтобы каждый раз при нажатии этой кнопки он отображал свое значение для Label?


import tkinter as tk

root = tk.Tk()
# Change the original tkinter icon
root.iconbitmap('C:\\Users\\bmxfi\Downloads\images.ico')
# Set the title of the window
root.title('Calculator')
# Change the geometry of the window
root.geometry('300x450+750+150')
# Setting Minimum and Maximum window width and height
root.minsize(width=300, height=450)
root.maxsize(width=300, height=450)
# Create Rows and Columns to display widgets
root.rowconfigure(0, weight=100)
root.rowconfigure(1, weight=100)
root.rowconfigure(2, weight=100)
# Columns start here:
root.columnconfigure(0, weight=100)
root.columnconfigure(1, weight=100)
root.columnconfigure(2, weight=100)
# Configuring the Main window named: root
root.configure(bg='#353535')
# Creating the main label that will display the calculated results
lab_1 = tk.Label(root, width=40)
lab_1.grid(row=0, column=1, columnspan=1, sticky='we')
lab_1.configure(bg='#545454', font=('Computer Modern', 25, 'bold'),
                fg='White', justify='right')
# Main Calculator Layout
# List Box for a calculator layout
box_1 = tk.Listbox(root)
box_1.grid(row=1, column=1, rowspan=2)
box_1.configure(bg='#353535', relief='flat')
# Button Layout
calculator_layout = [[(7, 1), (8, 1), (9, 1), ('(', 1), (')', 1)],
                     [(4, 1), (5, 1), (6, 1), ('×', 1), ('÷', 1)],
                     [(1, 1), (2, 1), (3, 1), ('+', 1), ('-', 1)],
                     [(0, 1), ('±', 1), ('.', 1), ('-', 1), ('=', 1)]]

# Iterating through my list to get a set of buttons
row = 0
for i in calculator_layout:
    col = 0
    for a in i:
        key_press = tk.Button(box_1, text=a[0])
        key_press.grid(row=row, column=col, ipadx=10, ipady=8, sticky='we')
        key_press.configure(background='#545454', fg='white',
                            font=('Computer Modern', 10),
                            activebackground='red', state='normal')
        col += a[1]
    row += 1

root.mainloop()
Автор: Braiden Gole Источник Размещён: 07.01.2018 10:21

Ответы (1)


1 плюс

73720 Репутация автора

Решение

Вы можете сделать это, задав lambdaкаждому Buttonаргумент со значением по умолчанию. Нет необходимости в каких-либо дополнительных forциклах, делающих это таким образом (это делается в той, которая создает Buttons).

Как это сделать, показано ниже в месте с # CHANGEDкомментарием. Остальная часть кода в каждой lambdaопределенной функции переконфигурирует textопцию Labelnamed lab_1, вызывая его configure()метод и передавая ему текущее содержимое textопции с Buttonдобавленным к ней символом связанной с ней функции.

...

# Iterating through my list to get a set of buttons
row = 0
for i in calculator_layout:
    col = 0
    for a in i:
        key_press = tk.Button(box_1, text=a[0])
        key_press.grid(row=row, column=col, ipadx=10, ipady=8, sticky='we')
        key_press.configure(background='#545454', fg='white',
                            font=('Computer Modern', 10),
                            activebackground='red', state='normal',
                            # CHANGED.
                            command=lambda sym=str(a[0]):
                                lab_1.configure(text=lab_1.cget('text')+sym))
        col += a[1]
    row += 1

root.mainloop()
Автор: martineau Размещён: 07.01.2018 11:31
Вопросы из категории :
32x32