过去一周,我一直在努力解决这个问题,需要一些帮助。我试图编写一个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/