代码部分:
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 1
bb.bind("<Button-1>",lambda obj,aa=aa:getcode(aa.get()))
|
2
muzuiget 2015-03-14 22:45:39 +08:00 1
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 1
虽然我不懂 tkinter ,但我只想说,楼主你需要明白变量作用域的问题。
在 lambda 中也好,或者在 getcode 函数也好,他们本身是在另一个函数的作用域里,mes 这个变量是进不去的。 |
8
oott123 2015-03-15 10:25:18 +08:00 via Android 1
抱歉,我又仔细的看了看你的问题,作用域似乎并不能解释你的问题。
我对 Python 并不熟悉,可能理解错了… |
9
oott123 2015-03-15 10:30:05 +08:00 via Android 1
查了一些资料,考虑你的问题可能是 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 一下,就知道整个程序代码的执行顺序了。
|