从def this()移动到def那个():我不能在这个()中得到小部件的值

时间:2017-02-02 17:54:36

标签: python tkinter

所以基本上我正在编写一个看起来像这样的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

它无法阅读我的条目,为什么会这样,并且有办法解决这个问题吗?

2 个答案:

答案 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
}