隐藏未调用的函数

时间:2014-10-23 02:32:56

标签: python tkinter

我是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()

请帮我纠正这个问题!

1 个答案:

答案 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()

产生所需的输出(只需几次点击):

enter image description here

然而,值得注意的是,一旦隐藏,点击将被记录,这是OP似乎想要的。如果您想查找用户点击的位置,请尝试(从effbot修改):

import Tkinter
root = Tkinter.Tk()
def callback(event):
    print "clicked at", event.x, event.y

root.bind("<Button-1>", callback)
root.mainloop()