Передача нескольких функций в качестве аргументов в лямбда-функции не работает - PullRequest
0 голосов
/ 12 июня 2019

эти две функции не работают как аргументы в функции lamba, которая вычисляет цену на конфеты

def mysweets():
    b = v.get( ) # get the value of v set
    cost=int(mysweets_price_list[b]) #price_display
    print(cost)



def quantity_sweets():
    q = int(spinbox1.get())
    print(q)

price = lambda b, q : b * q # final price to be displayed in myLabel_3

print(price(b, q))

Я пробовал вложенные функции, но они не работают, помогите, пожалуйста, всем

from tkinter import *

myGui = Tk()
myGui.geometry('450x450+200+200')
myGui.title('Auto Sweet Dispenser')

price_display = ""
b = 0
#a = 0
q = 0
mysweets_price_list = {1 :9.00,
                      2 :7.50,
                      } # dict for the sweet prices

def mysweets():
    b = v.get( ) # get the value of v set
    cost=int(mysweets_price_list[b]) #price_display
    print(cost)



def quantity_sweets():
    q = int(spinbox1.get())
    print(q)

price = lambda b, q : b * q # final price to be displayed in myLabel_3

print(price(b, q))


v =IntVar()
price =IntVar()
v.set(1)

myLabel = Label(myGui,text = 'Choose your sweets',font = 14, fg ='brown').place(x=140,y=55)#grid(row=3,column=10,sticky = 'e')

myRadio_1 = Radiobutton(myGui,text = 'Mints',variable = v, value = 1, command = mysweets).place(x= 160, y = 100)
myRadio_2 = Radiobutton(myGui,text = 'Nut log',variable = v, value = 2, command = mysweets).place(x= 160, y = 120)


myLabel_2 = Label(myGui,text = 'Select Quantity',font = 12, fg ='brown').place(x=160,y=160)#grid(row=3,column=10,sticky = 'e')

myLabel_3 = Label(myGui,textvariable = price ,font = "Times 14 bold",width = 14, fg ='white', bg= 'blue' ,relief = RAISED).place(x=160,y=220)#grid(row=3,column=10,sticky = 'e')


spinbox1 = Spinbox(myGui,from_=1,to = 6,command = quantity_sweets, state = NORMAL)
spinbox1.place(x=160,y=180)#



myGui.mainloop()

код работает, за исключением того, что цена не отображается, так как не работает лямбда-функция.

1 Ответ

1 голос
/ 12 июня 2019

Здесь вам не нужна лямбда (в общем, лямбда должна быть очень редкой).Вам нужна только одна функция, чтобы получить все данные, выполнить расчеты и обновить метку.Например:

from tkinter import *

myGui = Tk()
myGui.geometry('450x450+200+200')
myGui.title('Auto Sweet Dispenser')

mysweets_price_list = {1 :9.00,
                      2 :7.50,
                      } # dict for the sweet prices

def calculate():
    b = v.get( ) # get the value of v set
    cost=mysweets_price_list[b] #price

    q = int(spinbox1.get()) # get quantity.

    final_price = cost * q # final price to be displayed
    price.set(final_price)

v =IntVar(value=1) # set initial value to 1
price = IntVar()

Label(myGui,text = 'Choose your sweets',font = 14, fg ='brown').place(x=140,y=55)#grid(row=3,column=10,sticky = 'e')

Radiobutton(myGui,text = 'Mints',variable = v, value = 1, command = calculate).place(x= 160, y = 100)
Radiobutton(myGui,text = 'Nut log',variable = v, value = 2, command = calculate).place(x= 160, y = 120)

Label(myGui,text = 'Select Quantity',font = 12, fg ='brown').place(x=160,y=160)#grid(row=3,column=10,sticky = 'e')

Label(myGui,textvariable = price ,font = "Times 14 bold",width = 14, fg ='white', bg= 'blue' ,relief = RAISED).place(x=160,y=220)#grid(row=3,column=10,sticky = 'e')

spinbox1 = Spinbox(myGui,from_=1,to = 6,command = calculate, state = NORMAL)
spinbox1.place(x=160,y=180)

calculate() # do the calculation at boot
myGui.mainloop()

Также очень важно знать, что если вы делаете name = Widget().place(), тогда имя устанавливается на None и бесполезно.Вам нужно сделать

name = Widget()
name.grid() # or pack() or place()

или

Widget().grid() # or pack() or place()

Не смешивайте эти 2 стиля!Стиль 2-х линий гораздо лучше, и то, что мы обычно используем.

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