所以基本上我正在编写一个看起来像这样的TKINTER程序:
from tkinter import *
root = Tk()
def gettext():
yourname = myentry.get()
def this():
myentry = Entry(root)
myentry.grid(column=0, row=0)
mybutton = Button(root, text="Go >>>", command=gettext)
mybutton.grid(column=0, row=1)
this()
当我在IDLE 3.5中运行脚本时,我收到错误:
Traceback (most recent call last):
File "C:\Users\Luke\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1550, in __call__
return self.func(*args)
File "C:/Users/Luke/Desktop/test.py", line 6, in gettext
yourname = myentry.get()
NameError: name 'myentry' is not defined
它无法阅读我的条目,为什么会这样,并且有办法解决这个问题吗?
答案 0 :(得分:2)
Python的一个好处是你可以在函数中定义函数,这些子函数可以访问在子函数定义之前定义的变量。因此,您可以执行以下操作:
from tkinter import *
root = Tk()
# This is not the right place to define this if you want to "see" myentry
# def gettext():
# yourname = myentry.get()
def this():
myentry = Entry(root)
myentry.grid(column=0, row=0)
# Define it here
def gettext():
yourname = myentry.get()
mybutton = Button(root, text="Go >>>", command=gettext)
mybutton.grid(column=0, row=1)
this()
现在,函数gettext
存在于this
内,可以用作按钮的命令。此函数在myentry
范围内定义了this
。
我认为Sun Bear给出的答案对于您想要做的事情更为全面,但我认为这应该能够说明为什么您的特定代码无法以预期的方式运行。
现在,我刚刚编辑了你的代码,在适当的地方定义了gettext
函数,但是我应该注意你定义的函数没有返回值,所以它没有效果。因此,您需要更改它以执行您想要的操作,返回yourname
变量或打印yourname
。
答案 1 :(得分:0)
第6行中myentry
的原因未定义,因为gettext()
和this()
中的self
不是同一个变量。它们是独立的实体,它们只在本地存在的函数中存在。
解决这个问题的一个非常有用的方法,尤其是稍后编写更复杂的代码,是学习在tkinter.Frame类中编写函数并学习使用术语from tkinter import *
class App(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent=parent
self.this()
def this(self):
self.myentry = Entry(self)
self.myentry.grid(column=0, row=0)
self.mybutton = Button(self, text="Go >>>", command=self.gettext)
self.mybutton.grid(column=0, row=1)
def gettext(self):
yourname = self.myentry.get()
print('yourname is ', yourname)
if __name__ == '__main__':
root = Tk()
app = App(root)
app.grid(row=0, column=0, sticky='nsew')
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
app.mainloop()
来创建之间的链接您在类中的不同方法中创建的小部件和变量。我建议你在开始学习tkinter时学会这样做。您可以谷歌您不理解的条款。
以下是您想要实现的工作代码。希望这个例子有助于加速你的学习过程。
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton.init(type: .custom)
button.setTitle("Tester", for: .normal)
button.setTitleColor(.darkGray, for: .normal)
button.layer.borderWidth = 1
button.layer.cornerRadius = 5
button.layer.borderColor = UIColor.darkGray.cgColor
button.addTarget(self, action: #selector(self.handleButton), for: .touchUpInside)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let button = self.navigationItem.rightBarButtonItem?.customView {
button.frame = CGRect(x:0, y:0, width:80, height:34)
}
}
func handleButton( sender : UIButton ) {
// It would be nice is isEnabled worked...
sender.alpha = sender.alpha == 1.0 ? 0.5 : 1.0
}