所以,我对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
非常感谢任何帮助。
答案 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认为changeLabel
是Entry
的局部变量,它没有意识到它应该是您的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 & Manufacturing | Food & Snacks">Food & Snacks</option>
等