Чечбоксы в Ткинтере - PullRequest
0 голосов
/ 01 июля 2018

Я новичок в GUI, и я пишу некоторые фрагменты кода для школы. Это проблема, с которой я сталкивался в нескольких заданиях, и я не могу обернуться вокруг нее. Когда я устанавливаю флажки, возвращаемое значение всегда положительно, независимо от того, установлен ли флажок или нет. Например, это код, который я писал, который должен создать меню для выбора пользователем, и они отображают правильную сумму:

from tkinter import * 
def main(): 
    class Application(Frame):
        #GUI application that creates a menu to be chosen from and selections    to be made.
        def __init__(self, master):
            #Initialize Frame. 
            Frame.__init__(self, master)
            self.grid()
            self.createWidgets()

        def addPrices(self):
            #store price float
            price = 0.00

        #add all contents of the list selected
        #use if statement to determine which prices need to be added
            if self.isPizza:
                price += 3.00
            if self.isFries:
                price += 0.50
            if self.isCoke:
                price += 0.25
            if self.isChurro:
                price += 1.50 

        #display totals
        #Use label to print total
            Label(self,text = "Your total is: ").grid(row = 9, column = 0, columnspan = 2, sticky = W)
            Label(self,text = price).grid(row = 10, column = 0, columnspan = 2, sticky = W)   


        def createWidgets(self):
            #create instruction label 
            Label(self,text = "Please Select your Items:").grid(row = 0, column = 4, columnspan = 2, sticky = W)

            #create labels for checkboxes / menu
            Label(self,text = "Pizza.... $3.00").grid(row = 1, column = 5, sticky = W)
            Label(self,text = "Fries... $0.50").grid(row = 2, column = 5,  sticky = W)
            Label(self,text = "Coke... $0.25").grid(row = 3, column = 5,  sticky = W)
            Label(self,text = "Churro... $1.50").grid(row = 4, column = 5, sticky = W)

            #create input via checkboxes 
            #Create a plain of checkboxes to select items 
            self.isPizza = BooleanVar()
            Checkbutton(self,text = "Pizza",variable = self.isPizza).grid(row = 6, column = 0, sticky = W)
            self.isFries = BooleanVar()
            Checkbutton(self, text = "Fries",variable = self.isFries).grid(row = 6, column = 1, sticky = W)
            self.isCoke = BooleanVar()
            Checkbutton(self, text = "Coke",variable = self.isCoke).grid(row = 7, column = 0, sticky = W)
            self.isChurro = BooleanVar()
            Checkbutton(self, text = "Churro",variable = self.isChurro).grid(row = 7, column = 1, sticky = W)

            #Create submit button 
            Button(self,text = "Click to submit order",command = self.addPrices).grid(row = 8, column = 0, sticky = W)



    root = Tk()
    root.geometry("800x400") 
    root.title(" Order Up!")
    app = Application(root)
    root.mainloop()

main()

Программа всегда возвращает 5,25 как общее количество, которое является просто суммой всех элементов, добавленных вместе. Я пропускаю сегменты, которые изменят мои логические переменные в зависимости от ввода пользователя?

1 Ответ

0 голосов
/ 01 июля 2018

Вам нужно проверить логическое значение каждого значения Var, а не самого Var. Измените if self.isPizza: на if self.isPizza.get(): и т. Д., И ваша программа заработает.

PS Завершение всей вашей программы в def main: и вызов main(), как вы это сделали, бесполезны и тратят впустую уровень отступов и затрудняют чтение программы. Если вы хотите сделать файл полезным для импорта, а также для прямого запуска, определите ваши классы и функции верхнего уровня как уровень модуля и поместите код, который делает то, что не должно происходить при импорте, внутри main, а затем защитите исполнение основного. В этом случае:

from tkinter import *

class Application:
...
def main():
    root = Tk()
    ...
    root.mainloop()

if __name__ == '__main__':
    main()

Теперь вы можете импортировать этот файл в тестовый файл и тестировать класс Application, не используя root.mainloop ().

...