2017-10-19 5 views
0

J'essaie de demander à l'utilisateur d'entrer un nombre (dans cet exemple, ils doivent entrer un nombre de minutes dans la boîte minEntry) . Je veux prendre ce nombre et l'utiliser pour définir plusieurs valeurs de variable en multipliant cette valeur par d'autres nombres. Ensuite, je veux prendre cette valeur et l'afficher dans la boîte sublabel dans la fonction __init__. Je reçois un message d'erreur qui indique 'PageSix' object has no attribute 'peak_rate'. Je sais en quelque sorte ce que cela signifie mais je n'ai aucune idée de comment le résoudre.Utilisation d'une zone de saisie pour définir la valeur d'une variable et l'afficher dans une étiquette en utilisant Tkinter

class PageSix(tk.Frame): 

    def projected_figures(self): 
     global minEntry 
     tariff = self.controller.page_get(PageTwo) 
     minutes=minEntry.get() 
     self.peak_rate = tk.StringVar() 
     self.peak_rate.set(0) 
     self.off_peak = tk.StringVar() 
     self.off_peak.set(0) 
     self.line_rental = tk.StringVar() 
     self.line_rental.set(0) 
     if tariff.current_tariff == "A": 
      self.peak_rate.set("Peak Rate: £"+minutes*0.3) 
      self.off_peak.set("Off-Peak: £"+minutes*0.05) 
      self.line_rental.set("Line Rental: £15") 
     elif tariff.current_tariff == "B": 
      self.peak_rate.set("Peak Rate: £"+minutes*0.1) 
      self.off_peak.set("Off-Peak: £"+minutes*0.02) 
      self.line_rental.set("Line Rental: £20") 
     else: 
      self.peak_rate.set("Peak Rate: £"+minutes*0.9) 
      self.off_peak.set("Off-Peak: -") 
      self.line_rental.set("Line Rental: £30") 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller=controller 
     label = tk.Label(self, text="Account Balance", font=LARGE_FONT) 
     label.pack(pady=10,padx=10) 

     sublabel = tk.Label(self, textvariable=self.peak_rate, font=SMALL_FONT) 
     sublabel.pack(pady=10,padx=10) 

     sublabel2 = tk.Label(self, textvariable=self.off_peak, font=SMALL_FONT) 
     sublabel2.pack(pady=10,padx=10) 

     sublabel3 = tk.Label(self, textvariable=self.line_rental, font=SMALL_FONT) 
     sublabel3.pack(pady=10,padx=10) 

     minLabel = Label(self, text = 'Enter Minutes: ') 
     minEntry = Entry(self) 
     minLabel.pack(pady =10, padx = 10, side = TOP, anchor = S) 
     minEntry.pack(pady =10, padx = 10, side = TOP, anchor = S) 

     button1 = tk.Button(self, text="View Projected Figures", 
          command=self.projected_figures) 
     button1.pack() 

     button2 = tk.Button(self, text="Back to Menu", 
          command=lambda: controller.show_frame(StartPage)) 
     button2.pack() 

Aussi les lignes tariff = self.controller.get_page(PageTwo) et if self.current_tariff == "x" font référence à cette classe si elle peut être d'une quelconque utilité.

class PageTwo(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller=controller 
     self.current_tariff = tk.StringVar() 
     self.current_tariff.set("A") 

     label = tk.Label(self, text="Current Tariff", font=LARGE_FONT) 
     label.pack(pady=10,padx=10) 

     sublabel = tk.Label(self, textvariable=self.current_tariff, font=SMALL_FONT) 
     sublabel.pack(pady=10,padx=10) 

     button1 = tk.Button(self, text="Change Tariff", 
          command=lambda: controller.show_frame(PageSix)) 
     button1.pack() 

     button2 = tk.Button(self, text="Projected Figures", 
          command=lambda: controller.show_frame(PageSix)) 
     button2.pack() 

     button3 = tk.Button(self, text="Back to Home", 
          command=lambda: controller.show_frame(StartPage)) 
     button3.pack() 

Répondre

0

__init__ est appelée dès que vous initialisez la classe et projected_figures sera appelée quand vous l'appelez.

Lorsque vous essayez d'initialiser PageSix, à l'intérieur de __init__ à sublabel ligne de création, il n'y a pas variable nommée self.peak_rate depuis projected_figures n'a pas encore appelé.

La création de variables à l'intérieur de __init__ devrait résoudre ce problème.

def __init__(self, parent, controller): 
    ... 
    self.peak_rate = tk.StringVar() 
    self.peak_rate.set(0) 
    self.off_peak = tk.StringVar() 
    self.off_peak.set(0) 
    self.line_rental = tk.StringVar() 
    self.line_rental.set(0) 
    ...