【问题标题】:Using an entry box to set a variable's value and display it in a Label using Tkinter使用输入框设置变量的值并使用 Tkinter 在标签中显示它
【发布时间】:2017-10-19 11:11:08
【问题描述】:

我试图让用户输入一个数字(在本例中,他们需要在minEntry 框中输入分钟数)。我想取这个数字并用它来设置多个变量值,方法是将此值与其他数字相乘。然后我想取这个值并将它显示在__init__ 函数内的sublabel 框中。我收到一条错误消息,上面写着'PageSix' object has no attribute 'peak_rate'。我有点知道这意味着什么,但我不知道如何解决它。

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()

如果可以使用的话,tariff = self.controller.get_page(PageTwo)if self.current_tariff == "x" 行也引用了这个类。

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()

【问题讨论】:

    标签: python python-3.x tkinter tkinter-entry


    【解决方案1】:

    __init__ 会在您初始化类后立即被调用,projected_figures 将在您调用它时被调用。

    当您尝试初始化PageSix 时,在sublabel 创建行的__init__ 内部,没有名为self.peak_rate 的变量,因为projected_figures 尚未调用。

    __init__ 内移动变量创建应该可以解决这个问题。

    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)
        ...
    

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      相关资源
      最近更新 更多