过去一周,我一直在努力解决这个问题,需要一些帮助。我试图编写一个GUI来计算所有选定复选框的总数。到目前为止,这是我的代码:

import tkinter
import tkinter.messagebox

class Joes_auto:

    def __init__(self):

        # Create the main window.
        self.main_window = tkinter.Tk()

        # Create the frames.  One for the checkbuttons,
        # one for the total frame, and one for the buttons
        self.top_frame = tkinter.Frame(self.main_window)
        self.mid_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        #Create the IntVar objects to use with the checkbuttons
        self.oil_change = tkinter.IntVar()
        self.lube_job = tkinter.IntVar()
        self.radiator_flush = tkinter.IntVar()
        self.transmission_flush = tkinter.IntVar()
        self.inspection = tkinter.IntVar()
        self.muffler_replacement = tkinter.IntVar()
        self.tire_rotation = tkinter.IntVar()

        # Set the IntVar objects to 0
        self.oil_change.set(0)
        self.lube_job.set(0)
        self.radiator_flush.set(0)
        self.transmission_flush.set(0)
        self.inspection.set(0)
        self.muffler_replacement.set(0)
        self.tire_rotation.set(0)

        # Create the Checkbutton widgets in the top_frame
        self.oil_change = tkinter.Checkbutton(self.top_frame, text = 'Oil Change ($30)', \
                                                variable=self.oil_change)
        self.lube_job = tkinter.Checkbutton(self.top_frame, text = 'Lube Job ($20)', \
                                            variable=self.lube_job)
        self.radiator_flush = tkinter.Checkbutton(self.top_frame, text = 'Radiator Flush ($40)', \
                                          variable=self.radiator_flush)
        self.transmission_flush = tkinter.Checkbutton(self.top_frame, text = 'Transmission Flush ($100)', \
                                              variable=self.transmission_flush)
        self.inspection = tkinter.Checkbutton(self.top_frame, text = 'Inspection ($35)', \
                                      variable=self.inspection)
        self.muffler_replacement = tkinter.Checkbutton(self.top_frame, text = 'Muffler Replacement ($200)', \
                                               variable=self.muffler_replacement)
        self.tire_rotation = tkinter.Checkbutton(self.top_frame, text = 'Tire Rotation ($20)', \
                                         variable=self.tire_rotation)

        # Pack the Checkbuttons
        self.oil_change.pack()
        self.lube_job.pack()
        self.radiator_flush.pack()
        self.transmission_flush.pack()
        self.inspection.pack()
        self.muffler_replacement.pack()
        self.tire_rotation.pack()

        # Create a total and quit button
        self.total_button = tkinter.Button(self.bottom_frame, text = 'Calculate Total', \
                                           command = self.total)
        self.quit_button = tkinter.Button(self.bottom_frame, text = 'Quit', \
                                           command = self.main_window.destroy)

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

        # Pack the frames
        self.top_frame.pack()
        self.mid_frame.pack()
        self.bottom_frame.pack()

        # Start the mainloop
        tkinter.mainloop()

    def total(self):

        self.total = 0

        if self.oil_change.get() == 1:
            self.total += 30
        if self.lube_job.get() == 1:
            self.total += 20
        if self.radiator_flush.get() == 1:
            self.total += 40
        if self.transmission_flush.get() == 1:
            self.total += 100
        if self.inspection.get() == 1:
            self.total += 35
        if self.muffler_replacement.get() == 1:
            self.total += 200
        if self.tire_rotation.get() == 1:
            self.total += 20

        tkinter.messagebox.showinfo("Your total is", self.total)

joes_auto = Joes_auto()


每次我运行程序时,我都会得到AttributeError:Checkbutton没有属性“ get”。我希望程序计算所有已检查服务的总数并显示总数。

最佳答案

首先,创建一堆IntVar并将它们另存为Joes_auto实例的属性,

self.oil_change = tkinter.IntVar()


等等,但是随后您用

self.oil_change = tkinter.Checkbutton(self.top_frame, text = 'Oil Change ($30)', \
                                                variable=self.oil_change)


等。所以现在self.oil_change指的是Checkbutton,而不是IntVar。这就是为什么您会收到该错误的原因:IntVar具有.get方法,而Checkbutton小部件则没有。

因此,您需要为Checkbuttons提供与其关联的IntVars不同的名称。甚至不用去给他们起永久性的名字

b = tkinter.Checkbutton(self.top_frame, text = 'Oil Change ($30)',
                                        variable=self.oil_change)
b.pack()
b = tkinter.Checkbutton(self.top_frame, text = 'Lube Job ($20)',
                                    variable=self.lube_job)
b.pack()


等等。(我摆脱了这些反斜杠-您不需要在那儿,因为您要在括号内继续一行。这在括号和花括号内也适用)。



顺便说一句,您可以通过更改来节省一些键入

import tkinter




import tkinter as tk


那你就可以

b = tk.Checkbutton(self.top_frame, text = 'Oil Change ($30)', variable=self.oil_change)


等等

关于python - 带有复选框的Python GUI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40693440/

10-10 09:53