Python GUI tkinter NameError

时间:2018-04-04 13:23:43

标签: python user-interface tkinter

我是新来的,我在使用Python Tkinter进行测验时遇到了问题。

所以这是代码:

b5 = Button(root, text="Next Question",command=question_2_output)
b5.configure(command = des)
b5.pack(side=BOTTOM)

使用此按钮即可尝试访问两个功能。 - >

def question_2_output():

    lab7 = Label(root, text="Qestion 2 Qestion 2 Qestion 2 Qestion 2", 
    font="Verdana 11 italic")
    lab7.pack()
    lab7.place(x = 350, y = 60)


def des():
    q1.destroy()

使用此代码,我尝试将lab7放在上一个问题q1所在的同一个地方,并销毁/删除旧的标签(问题)。但我收到此错误NameError:名称'q1'未定义。我不能破坏q1。 q1在此功能中。

def question_1_output():
    q1 = Label(root, text="This is a very very very very very long question?", font="Verdana 11 italic")
    q1.pack()
    q1.place(x = 350, y = 60)

任何帮助?谢谢!

3 个答案:

答案 0 :(得分:1)

我认为你可能会更新标签,而不是销毁标签并添加新标签。

我还会使用一个类来构建这个GUI,因为它更容易使用类属性和更清晰的阅读。避免使用global是一种很好的做法,我们可以使用类属性来做到这一点。

以下是如何更新标签和按钮的简单示例。

import tkinter as tk


class GUI(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent=parent
        self.question_label = tk.Label(self, text="Question 1", font="Verdana 11 italic")
        self.question_label.pack()
        self.b1 = tk.Button(self, text="Next Question",command=self.question_2_output)
        self.b1.pack(side=tk.BOTTOM)

    def question_1_output(self):
        self.question_label.config(text="Question 1")
        self.b1.configure(text="Next Question", command=self.question_2_output)

    def question_2_output(self):
        self.question_label.config(text="Question 2")
        self.b1.configure(text="Previous Question", command=self.question_1_output)


if __name__ == "__main__":
    root = tk.Tk() 
    GUI(root).pack()
    tk.mainloop()

答案 1 :(得分:0)

global variable q1函数和question_1_output()函数

中将其声明为des()
def des():
    global q1
    q1.destroy()


def question_1_output():
    global q1
    q1 = Label(root, text="This is a very very very very very long question?", font="Verdana 11 italic")
    q1.pack()

让你button执行两个功能,你可以这样做

b5 = Button(root, text="Next Question", command=lambda:[des(), question_2_output()])
b5.pack(side=BOTTOM)

答案 2 :(得分:0)

q1位于函数question_1_output的本地范围内,因此在函数des中不可见。

重新排序定义或从函数返回对象,如下所示:

def question_1_output():
    q1 = Label(root, text="This is a very very very very very long question?", font="Verdana 11 italic")
    q1.pack()
    q1.place(x = 350, y = 60)
    return q1

def des(question):
    question.destroy()

q1 = question_1_output()
des(q1)

虽然我没有看到函数des的重点,如果它只是在对象上调用destroy