Изменение значения переменной когда пользователь делает выбор. Python, tkinter
У меня появилась проблема при написании кода программы калькулятора расчета стоимости. Мне нужно чтоб когда пользователь нажимает кнопку на главном окне выскакивало доп. окно(Я сделал методом TopLevel в tkinter) и на нем присутствовали кнопки с картинками чтоб пользователь выбирал изделие. Суть самой проблемы заключается в том что я не могу реализовать так чтоб в функции расчета стоимости менялся определенный коефициент в зависимости от выбраного изделия в дочернем окне. Пробовал глобализировать переменные
P_Baget = int(width) + int(height) ## Baget perimeter
prise_per_sm = int(coeficient_8_corners) * dollar ## prise per sm
quantity_cm = int(P_Baget) * 2 + int(baget_141703) * 8 ## quantity (кл-во)cm
product_prise = quantity_cm * prise_per_sm ## prise product
Вот сама формула которую я написал, она рабочая и работает нормально но только с одным изделием Мне нужно чтоб менялись переменные "coeficient_8_corners" и "baget_141703" Основная загвоздка в том что при нажатии на кнопку в дочернем окне данные не записываются в переменные. Вот код доченего окна, то что я пробовал. Оно работает, но свои функции кнопка не выполняет.
def toplevel(event):
window = Toplevel(root)
Label(window,text="Выберите багет").grid()
button_baget_img = PhotoImage(file="img/Baget-1417-03.png")
buton = Button(window,image = button_baget_img, command=bottom).grid()
button_baget_img.grid()
def bottom():
globals()['constant_baget_141703'] = 1.5
globals()['coeficient_8_corners'] = 0.008
Прошу строго не судить, программист я только начинающий. Очень буду благодарен за помощь.
Ответы (1 шт):
Думаю, вам поможет этот пример:
import tkinter as tk
const = 0
coef = 0
values_dict = {
'baget 1':[1.5, 0.008],
'baget 2':[2, 0.1],
}
def new_win(root):
window = tk.Toplevel(root)
window.bind('<Destroy>', update_label) # когда окно закроют - вызовется update_level
tk.Label(window,text="Выберите багет").grid()
tk.Button(window, text='Select1', command=lambda: change_value('baget 1')).grid() # выбор №1
tk.Button(window, text='Select2', command=lambda: change_value('baget 2')).grid() # выбор №2
def update_label(ev): # обновляем текст в label
label['text'] = f'const = {const}, coef = {coef}'
def change_value(key):
global const, coef
const, coef = values_dict.get(key)
root = tk.Tk()
tk.Button(root, text='new win', command=lambda: new_win(root)).grid()
label = tk.Label(root, text=f'const = {const}, coef = {coef}')
label.grid()
root.mainloop()
UPD: у вас, вероятно, будет не 2 и не 3 кнопки выбора, поэтому можно сделать так:
import tkinter as tk
const = 0
coef = 0
imgs_dict = {
'baget 1': 'img/baget1.png',
'baget 2': 'img/baget2.png',
}
values_dict = {
'baget 1':[1.5, 0.008],
'baget 2':[2, 0.1],
}
def new_win(root):
window = tk.Toplevel(root)
tk.Label(window,text="Выберите багет").grid()
for key, path in imgs_dict.items():
img = PhotoImage(file=path)
tk.Button(window, image=img, command=lambda: change_value(key)).grid()
img.grid()
window.bind('<Destroy>', update_label)
def update_label(ev):
label['text'] = f'const = {const}, coef = {coef}'
def change_value(key):
global const, coef
const, coef = values_dict.get(key)
root = tk.Tk()
tk.Button(root, text='new win', command=lambda: new_win(root)).grid()
label = tk.Label(root, text=f'const = {const}, coef = {coef}')
label.grid()
root.mainloop()