Python 3.5中GUI的用户输入

时间:2016-01-15 14:04:27

标签: python user-interface tkinter python-3.5

所以,我对Python很陌生,但是一旦把它们放在一个类中,我就很难处理它们。

当没有周围的类时,以下代码可以正常工作,但是一旦我添加它,我就会收到错误:

NameError: name 'someName' is not defined

这发生在第3行

text = "You have entered " + someName.get()

以下是代码:

class GUI:
    def changeLabel():
        text = "You have entered " + someName.get()
        labelText.set(text)
        someName.delete(0, END)
        someName.insert(0, "You've clicked!")
        return

    app = Tk()
    app.title("GUI Test")
    app.geometry('450x300')

    labelText = StringVar()
    labelText.set("Click when ready")
    label1 = Label(app, textvariable=labelText, height=4)
    label1.pack()

    userInput = StringVar(None)
    someName = Entry(app, textvariable=userInput)
    someName.pack()

    button1 = Button(app, text="Click Here", width=20,command=changeLabel)
    button1.pack(side='bottom',padx=15,pady=15)

    app.mainloop()

GUI #calling the class to run

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误,并且没有以您应该的方式使用类。我修改了你的代码并对新行进行了评论,以便你了解正在发生的事情。我已经为所有文本变量添加了self引用,以便可以正确访问它们。

from tkinter import *

class GUI:
        #set these so that they are able to be used by the whole class
        labelText = ""
        userInput = "" 

        #you should have an init method for your classes and do all the setup here
        def __init__(self,master):   
                self.labelText = StringVar()
                self.userInput = StringVar()

                #you should pack things into a frame
                frame = Frame(master)     
                frame.pack()

                self.labelText.set("Click when ready")
                label1 = Label(frame, textvariable=self.labelText, height=4)
                label1.pack()

                someName = Entry(frame, textvariable=self.userInput)
                someName.pack()

                button1 = Button(frame, text="Click Here", width=20,command=self.changeLabel)
                button1.pack(side='bottom',padx=15,pady=15)

        def changeLabel(self):
                text = "You have entered " + self.userInput.get()
                self.labelText.set(text)
                self.userInput.set("You've clicked!")
                return

#create the app before you call the GUI.
app = Tk()
app.title("GUI Test")
app.geometry('450x300')

# when you create the class, you need to assign it to a variable
applet = GUI(app) #calling the class to run
app.mainloop()

答案 1 :(得分:0)

您的__init__课程格式不正确。您不应该只将代码转储到类中,它应该在一个方法(属于一个类的函数)中。对于这样的东西,通常的方法是将它放在self.attribute_name方法中,当你通过调用它来创建类的实例时会自动调用它。

方法可以有自己的局部变量,也可以使用NameError: name 'someName' is not defined语法访问实例的属性。您的someName错误消息是因为Python认为changeLabelEntry的局部变量,它没有意识到它应该是您的self小部件。

无论如何,我修复了你的代码以便它运行;大概它会按照你的意图行事。请注意,这些方法的第一个参数为from Tkinter import * class GUI(object): def changeLabel(self): text = "You have entered " + self.someName.get() self.labelText.set(text) self.someName.delete(0, END) self.someName.insert(0, "You've clicked!") def __init__(self): app = Tk() app.title("GUI Test") app.geometry('450x300') self.labelText = StringVar() self.labelText.set("Click when ready") label1 = Label(app, textvariable=self.labelText, height=4) label1.pack() userInput = StringVar(None) self.someName = Entry(app, textvariable=userInput) self.someName.pack() button1 = Button(app, text="Click Here", width=20,command=self.changeLabel) button1.pack(side='bottom',padx=15,pady=15) app.mainloop() GUI() #calling the class to run 。请阅读一些关于类的Python文档/教程以获取更多信息。

import

此代码适用于Python 2;您需要将Python 3上的from tkinter import *语句更改为import *。实际上,不建议使用import tkinter as tk ,因为它会使用所有导入的名称污染您的命名空间。最好做一些像

这样的事情
app = tk.Tk()

然后编写你的Tkinter引用,如

label1 = tk.Label(app, textvariable=self.labelText, height=4)

<option id="Applicant_Industry" value="Engineering &amp; Manufacturing | Food &amp; Snacks">Food &amp; Snacks</option>