Пустая рамка Ткинтер

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

Достаточно просто. Вот мой код:

import tkinter
import tkinter.messagebox


class auto:

    def __init__(self):
        #create main window
        self.main_window=tkinter.Tk()

        #create frames
        self.top_frame=tkinter.Frame(self.main_window)
        self.bottom_frame=tkinter.Frame(self.main_window)

        #create value objects
        self.oil=tkinter.IntVar()
        self.lube=tkinter.IntVar()
        self.rad=tkinter.IntVar()
        self.trans=tkinter.IntVar()
        self.inspect=tkinter.IntVar()
        self.muff=tkinter.IntVar()
        self.tire=tkinter.IntVar()

        #set values
        self.oil.set(26)
        self.lube.set(18)
        self.rad.set(30)
        self.trans.set(80)
        self.inspect.set(15)
        self.muff.set(100)
        self.tire.set(20)

        #create checkbutton widgets
        self.oilb=tkinter.Checkbutton(self.top_frame,\
                                      text="Oil Change- $26.00" ,\
                                      variable=self.oil)
        self.lubeb=tkinter.Checkbutton(self.top_frame,\
                                      text= "Lube Job- $18.00",\
                                      variable=self.lube)
        self.radb=tkinter.Checkbutton(self.top_frame,\
                                      text= "Radiator Flush- $30.00" ,\
                                      variable=self.rad)
        self.transb=tkinter.Checkbutton(self.top_frame,\
                                      text= "Transmission Flush- $80.00",\
                                      variable=self.trans)
        self.inspectb=tkinter.Checkbutton(self.top_frame,\
                                      text= "Inspection- $15.00",\
                                      variable=self.inspect)
        self.muffb=tkinter.Checkbutton(self.top_frame,\
                                      text= "Muffler Replacement- $100.00",\
                                      variable=self.muff)
        self.tireb=tkinter.Checkbutton(self.top_frame,\
                                      text= "Tire Rotation- $20.00",\
                                      variable=self.tire)

    def display_charge():
        total=0
        for var in(self.oil,self.lube,self.rad,self.trans,self.inspect,self.muff,self.tire):
            total+=var.get()
            total_l.config(text="{}.00".format(total))

        #pack the check buttons
        self.oilb.pack()
        self.lubeb.pack()
        self.radb.pack()
        self.transb.pack()
        self.inspectb.pack()
        self.muffb.pack()
        self.tireb.pack()

        #create charge and quit buttons
        self.display_button=tkinter.Button(self.bottom_frame, \
                            text= "Display Charges", command=self.display_charge)
        self.quit_button=tkinter.Button(self.bottom_frame,\
                            text="Quit", command=self.mainwindow.destory)

        #pack the buttons
        self.display_button.pack(side='left')
        self.quit_button.pack(side='left')

        #pack frames
        self.top_frame.pack()
        self.bottom_frame.pack()

        #start main loop
        tkinter.mainloop()

mygui=auto()

Когда я запускаю программу, рамка пуста. Что я сделал не так? У меня также есть проблема с получением полной суммы (я не знаю, как). Но эта дилемма будет недействительной, если я не смогу даже правильно показать кадр.

Как мне показать вещи в кадре и как рассчитать общую стоимость?

1 ответ

У вашего кода было несколько проблем.

  1. Нестандартная классовая структура tkinter приложение, включая инициализацию и mainloop(),
  2. Опечатки, такие как mainwindow/main_window а также destroy/destory,
  3. display_charge() делал гораздо больше, чем показ заряда; это делало половину настройки GUI также.
  4. display_charge() ссылался на total_l объект, который не существует.
  5. Checkbuttonне работают так. Когда вы их очищаете, они устанавливаются на 0, а когда вы проверяете их, они устанавливаются на 1. Если вы set() их с пользовательскими значениями, они будут правильными, пока вы не переключите их, после чего они вернутся к своим значениям по умолчанию. Чтобы правильно задать им пользовательские значения, используйте offvalue а также onvalue атрибутов.
  6. Это проблема стиля, а не функциональности, но старайтесь не использовать явное продолжение строки (\) если это не нужно.

import tkinter

class auto:

    def __init__(self, parent):
        # create reference to main window
        self.main_window = parent

        #create frames
        self.top_frame=tkinter.Frame(self.main_window)
        self.bottom_frame=tkinter.Frame(self.main_window)

        #create value objects
        self.oil=tkinter.IntVar()
        self.lube=tkinter.IntVar()
        self.rad=tkinter.IntVar()
        self.trans=tkinter.IntVar()
        self.inspect=tkinter.IntVar()
        self.muff=tkinter.IntVar()
        self.tire=tkinter.IntVar()

        #create checkbutton widgets
        self.oilb=tkinter.Checkbutton(self.top_frame,
                                      text="Oil Change- $26.00" ,
                                      variable=self.oil, onvalue=26)
        self.lubeb=tkinter.Checkbutton(self.top_frame,
                                      text= "Lube Job- $18.00",
                                      variable=self.lube, onvalue=18)
        self.radb=tkinter.Checkbutton(self.top_frame,
                                      text= "Radiator Flush- $30.00" ,
                                      variable=self.rad, onvalue=30)
        self.transb=tkinter.Checkbutton(self.top_frame,
                                      text= "Transmission Flush- $80.00",
                                      variable=self.trans, onvalue=80)
        self.inspectb=tkinter.Checkbutton(self.top_frame,
                                      text= "Inspection- $15.00",
                                      variable=self.inspect, onvalue=15)
        self.muffb=tkinter.Checkbutton(self.top_frame,
                                      text= "Muffler Replacement- $100.00",
                                      variable=self.muff, onvalue=100)
        self.tireb=tkinter.Checkbutton(self.top_frame,
                                      text= "Tire Rotation- $20.00",
                                      variable=self.tire, onvalue=20)

        #create charge and quit buttons
        self.display_button=tkinter.Button(self.bottom_frame,
                            text= "Display Charges", command=self.display_charge)
        self.quit_button=tkinter.Button(self.bottom_frame,
                            text="Quit", command=self.main_window.destroy)
        self.total_l = tkinter.Label(self.bottom_frame, text="$0.00")

        #pack frames
        self.top_frame.pack()
        self.bottom_frame.pack()

        #pack the check buttons
        self.oilb.pack()
        self.lubeb.pack()
        self.radb.pack()
        self.transb.pack()
        self.inspectb.pack()
        self.muffb.pack()
        self.tireb.pack()

        #pack the buttons
        self.display_button.pack(side='left')
        self.quit_button.pack(side='left')
        self.total_l.pack(side='left')

    def display_charge(self):
        self.total_l.config(text="${}.00".format(sum(map(tkinter.IntVar.get,
        [self.oil, self.lube, self.rad, self.trans, self.inspect, self.muff,
        self.tire]))))

root=tkinter.Tk()
mygui=auto(root)
root.mainloop()
Другие вопросы по тегам