关于NameError

时间:2017-05-02 18:23:45

标签: python-3.x class tkinter

我是编程新手,这是我在网站上的第一篇文章。我确定我犯了一个愚蠢的错误,但我真的很欣赏向正确的方向发展。我试图制作一个计算器,并希望创建一个为数字生成Button对象的函数。当我尝试运行时,我收到错误:

' NameError:name' num_but_gen'未定义'

以下是代码:

from tkinter import * 

WINDOW_HEIGHT = 300
WINDOW_WIDTH = 325

class Window(Frame):

    def __init__(self, master = None):
        Frame.__init__(self, master)
        self.master = master
        self.init_window()

    def num_but_gen(self, disp, xloc=0, yloc=0, wid=0, hei=0):
        self.Button(text='{}'.format(disp),height=hei, width=wid)
        self.place(x=xloc, y=yloc)

    def init_window(self):
        self.master.title('Calculator')
        self.pack(fill=BOTH, expand=1)
        Button1 = num_but_gen('1', xloc=0, yloc=200, wid=40, hei=40)


root = Tk()
app = Window(root)
root.geometry("{}x{}".format(WINDOW_WIDTH,WINDOW_HEIGHT))
root.mainloop()

任何帮助将不胜感激!对于如何在以后的帖子中更好地表达我的问题标题的建议,任何人都可以获得奖励积分。

1 个答案:

答案 0 :(得分:0)

jasonharper是对的,您需要在self前添加num_but_gen,但您的代码中还有其他问题。

num_but_gen

  • 您的窗口类没有Button属性,因此您需要删除self.前面的Button
  • 它不是Window实例,而是您要放置的按钮
  • 您不需要使用text='{}'.format(disp)text=disp也会这样做。

init_window

  • num_but_gen的结果存储在变量中,但此函数不返回任何内容以使其无用(大写的名称不应用于变量,只能用于类名)
  • 显示文本的按钮的宽度选项是字母,而不是像素,其高度选项是文本行,因此wid=40, hei=40将创建一个非常大的按钮。如果要设置按钮大小(以像素为单位),可以通过place方法来实现。

以下是相应的代码:

import tkinter as tk

WINDOW_HEIGHT = 300
WINDOW_WIDTH = 325

class Window(tk.Frame):

    def __init__(self, master = None):
        tk.Frame.__init__(self, master)
        self.master = master
        self.init_window()

    def num_but_gen(self, disp, xloc=0, yloc=0, wid=0, hei=0):
        button = tk.Button(self, text=disp)
        button.place(x=xloc, y=yloc, height=hei, width=wid)

    def init_window(self):
        self.master.title('Calculator')
        self.pack(fill=tk.BOTH, expand=1)
        self.num_but_gen('1', xloc=0, yloc=200, wid=40, hei=40)


root = tk.Tk()
app = Window(root)
root.geometry("{}x{}".format(WINDOW_WIDTH,WINDOW_HEIGHT))
root.mainloop()