为什么这段代码可以从GUI Python的教科书中获取?

时间:2013-11-18 02:59:37

标签: python user-interface

为什么这不起作用。这直接来自教科书。我收到一个属性错误,说self._area不存在。

from Tkinter import *
import math

class CircleArea(Frame):

    def __init__(self):
        """Sets up a window and widgets."""
        Frame.__init__(self)
        self.master.title("Circle Area")
        self.grid()

        #Label and field for radius
        self._radiusLabel = Label(self, text = "Radius")
        self._radiusLabel.grid(row = 0, column = 0)
        self._radiusVar = DoubleVar()
        self._radiusEntry = Entry(self, textvariable = self._radiusVar)
        self._radiusEntry.grid(row = 0, column = 1)

        #Label and field for the area
        self._areaLabel = Label(self, text = "Area")
        self._areaLabel.grid(row = 1, column = 0)
        self._areaVar = DoubleVar()
        self._areaEntry = Entry(self, textvariable = self._areaVar)
        self._areaEntry.grid(row = 1, column = 1)

        # The command button
        self._button = Button(self, text = "Compute", command = self._area)
        self._button.grid(row = 2, column = 0, columnspan = 2)

        def _area(self):
            """Event handler for button."""
            radius = self._radiusVar.get()
            area = radius ** 2 * math.pi
            self._areaVar.set(area)

        def main():
            CircleArea(). mainloop()
    run = CircleArea()
    run.main()

是因为_area方法在调用后声明了吗?这没有任何意义,为什么它不能使用向下编程技术。我刚刚开始学习GUI的新手。关于类的GUI的第一章。

编辑*:我希望弹出一个窗口并有一个输入字段用于输入圆的半径。带有Radius标签。以及基于半径的圆形区域结果的输出输入字段。以及计算它的底部的计算按钮。

我只是想习惯输入不同的命令等。我还没有参加过这个讲座。我只是看到这段代码会做什么以及它会是什么样子。如果这让你感觉更好,我会手工输入它。:P而不是复制和粘贴。

2 个答案:

答案 0 :(得分:9)

问题是你的缩进是错误的。 _areamain__init__内定义,您不需要。下面是正确的缩进(您不需要main函数)。

from Tkinter import *
import math

class CircleArea(Frame):

    def __init__(self):
        """Sets up a window and widgets."""
        Frame.__init__(self)
        self.master.title("Circle Area")
        self.grid()

        #Label and field for radius
        self._radiusLabel = Label(self, text = "Radius")
        self._radiusLabel.grid(row = 0, column = 0)
        self._radiusVar = DoubleVar()
        self._radiusEntry = Entry(self, textvariable = self._radiusVar)
        self._radiusEntry.grid(row = 0, column = 1)

        #Label and field for the area
        self._areaLabel = Label(self, text = "Area")
        self._areaLabel.grid(row = 1, column = 0)
        self._areaVar = DoubleVar()
        self._areaEntry = Entry(self, textvariable = self._areaVar)
        self._areaEntry.grid(row = 1, column = 1)

        # The command button
        self._button = Button(self, text = "Compute", command = self._area)
        self._button.grid(row = 2, column = 0, columnspan = 2)

    def _area(self):
        """Event handler for button."""
        radius = self._radiusVar.get()
        area = radius ** 2 * math.pi
        self._areaVar.set(area)

run = CircleArea()
run.mainloop()

答案 1 :(得分:0)

实际上我认为你错过了main方法中的一个参数,你定义了一个CircleArea类,但是在python中你知道,类中定义的每个方法都必须有一个名为'self'的默认参数,所以试试这个
def main(self):     CircleArea()。主循环() 我认为它可以按你的意愿工作:)