
代码部分:
from Tkinter import * import tkMessageBox def getcode(mes): tkMessageBox.showinfo("get code", 'this code:'+mes) def win2(self): root2=Toplevel() aa = Entry(root2,width=5) aa.pack() bb=Button(root2,text='get') bb.pack() mes=aa.get() bb.bind("<Button-1>",getcode(mes)) root2.mainloop() root = Tk() root.wm_title("TEST") zh = Button(root,text="Test") zh.bind("<Button-1>",win2) zh.pack() root.mainloop() 刚开始学习GUI编程,但是想获得tkinter子窗口的数据时候发生了奇怪的错误。
当点击Button:Test的时候,root2窗口弹出的同时触发了getcode函数,但是在root2窗口中点击Button:get无效。
求解!
1 iptux 2015-03-14 22:38:12 +08:00 bb.bind("<Button-1>",lambda obj,aa=aa:getcode(aa.get())) |
2 muzuiget 2015-03-14 22:45:39 +08:00 bb.bind("<Button-1>",getcode(mes)) 注意,getcode(mes) 是传递了getcode(mes) 的返回结果,不是 getcode 函数本身,这段代码在进入 root.mainloop() 的时候就执行了,应该改成这样 bb.bind("<Button-1>",getcode) |
3 chaoyj OP |
4 chaoyj OP 提示 TypeError: cannot concatenate 'str' and 'instance' objects |
5 chaoyj OP |
6 chaoyj OP @iptux 经测试:bb.bind("<Button-1>",lambda obj:getcode(aa.get())) 这样的语句也可用, 但是为什么bb.bind("<Button-1>",lambda obj:getcode(mes)) 这样就获取不了值呢? 上一句已经有了mes=aa.get()。 lambda既然可以获取aa.get(),为什么不能获取mes呢? |
7 oott123 2015-03-15 10:23:57 +08:00 via Android 虽然我不懂 tkinter ,但我只想说,楼主你需要明白变量作用域的问题。 在 lambda 中也好,或者在 getcode 函数也好,他们本身是在另一个函数的作用域里,mes 这个变量是进不去的。 |
8 oott123 2015-03-15 10:25:18 +08:00 via Android 抱歉,我又仔细的看了看你的问题,作用域似乎并不能解释你的问题。 我对 Python 并不熟悉,可能理解错了… |
9 oott123 2015-03-15 10:30:05 +08:00 via Android 查了一些资料,考虑你的问题可能是 aa.get() 执行的时机不一样导致的。 |
11 oott123 2015-03-15 11:25:57 +08:00 其实我想的是“原来 Python 也有闭包”…… 我的 Python 一直学得一知半解的2333 |
13 muzuiget 2015-03-15 12:43:06 +08:00 @chaoyj 因为 mes 要是一个 tk 的 Event 对象,你用下 print 语句,在每行关键地方 print 一下,就知道整个程序代码的执行顺序了。 |