我是python的新手并尝试以下程序。我有一个代码片段,它将标签位置输出到shell。 我想隐藏标签或让它们看不见。但是仍然希望获得输出,即使我没有看到它们也会点击。
我写了一些代码,但它仍然可见。
我的编码:
import Tkinter
root = Tkinter.Tk()
def unshow_me(event):
event.widget.grid_forget()
def handle_click(text):
print text
a=text
for r in range(3):
for c in range(6):
text = 'R=%s,C=%s'%(r,c)
label = Tkinter.Label(root, text=text, borderwidth=1 )
label.grid(row=r,column=c)
label.bind("<Button-1>", lambda e, text=text:handle_click(text),unshow_me)
root.mainloop()
请帮我纠正这个问题!
答案 0 :(得分:2)
正如布莱恩·奥克利指出的那样,你不要打电话给unshow_me
。但是,unshow_me
根本不是lambda的一部分:
>>> def f():pass
...
>>> def g():pass
...
>>> lambda x: f(), g()
(<function <lambda> at 0x7f7737a267b8>, None)
>>> lambda x: (f(), g())
<function <lambda> at 0x7f7737a267b8>
原因是lambda
关键字在Python中具有lowest precedence。在lambda
正文中添加括号,其中包含您身体中的第二个函数,并使用参数unshow_me
调用e
,这样就会使lambda
:
lambda e, text=text:(handle_click(text), unshow_me(e))
您的完整计划是:
import Tkinter
root = Tkinter.Tk()
def unshow_me(event):
event.widget.grid_forget()
def handle_click(text):
print text
a=text
for r in range(3):
for c in range(6):
text = 'R=%s,C=%s'%(r,c)
label = Tkinter.Label(root, text=text, borderwidth=1 )
label.grid(row=r,column=c)
label.bind("<Button-1>", lambda e, text=text:(handle_click(text), unshow_me(e)))
root.mainloop()
产生所需的输出(只需几次点击):
然而,值得注意的是,一旦隐藏,点击将不被记录,这是OP似乎想要的。如果您想查找用户点击的位置,请尝试(从effbot修改):
import Tkinter
root = Tkinter.Tk()
def callback(event):
print "clicked at", event.x, event.y
root.bind("<Button-1>", callback)
root.mainloop()