2016-11-19 51 views
1

过去一周我一直在解决这个问题,需要一些帮助。我正在尝试编写一个GUI来计算所选的所有复选框的总数。这是我到目前为止的代码:带有复选框的Python 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有没有属性“得到”。我希望程序计算检查的所有服务的总数并显示总数。

+1

问题是你设置了自我。oil_change = tkinter.IntVar()'是一个'IntVar'(这很好),但是稍后你会覆盖它'self.oil_change = tkinter.Checkbutton(..)'。从那时起,'self.oil_change'将不再是'IntVar',而是对Checkbutton的引用。 Checkbutton本身没有'get()'方法。解决方案:为'IntVar'和'Checkbox'对象使用不同的变量名称。 – ImportanceOfBeingErnest

回答

1

首先创建了一堆IntVar S和它们保存为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) 

1

当您创建Checkbutton实例时,您将覆盖具有相同名称的IntVar变量。

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

避免通过为Checkbutton实例选择其他名称。实际上,没有复选框实例引用的用例;您可以立即收拾不保存到变量:

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

还有另一种属性覆盖问题,在total方法:该方法覆盖self.total;方法将被替换为int对象。因为该方法是受约束的,并且不会在外面使用;因此除非您在其他地方访问total方法,否则不会出现症状,但仍然无效。

我建议将self.total = 0更改为total = 0,因为total仅用于该方法。

def total(self): 
    total = 0 

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

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