Python 向tkinter菜单添加一个函数,使其仅在x!=没有一个

Python 向tkinter菜单添加一个函数,使其仅在x!=没有一个,python,tkinter,lambda,Python,Tkinter,Lambda,我想在我的GUI上有一个菜单栏。在此菜单栏中,我希望有一个标签,单击此标签时,应检查用于处理的文件\u数据\u的值。然后,根据它是否为真,将运行2个函数中的1个。我想在调用函数的同一语句中检查这一点 到目前为止,我得到的代码是: self.menu_main_top_evaluation.add_command(label=self.test_me, command=lambda: guif.run_test(self.test_me, self.file_data_for_proces

我想在我的GUI上有一个菜单栏。在此菜单栏中,我希望有一个标签,单击此标签时,应检查用于处理的
文件\u数据\u的值。然后,根据它是否为真,将运行2个函数中的1个。我想在调用函数的同一语句中检查这一点

到目前为止,我得到的代码是:

self.menu_main_top_evaluation.add_command(label=self.test_me,
    command=lambda: guif.run_test(self.test_me, self.file_data_for_processing))

现在,我必须执行第三个函数,首先检查
file\u data\u的值进行处理,然后根据结果选择要调用的函数。

最好的方法是使用标准函数。lambda只有在必须向函数传递参数时才有用,而在这里不需要这样做。否则,lambda只会使卡更难编写、更难理解和调试。就我个人而言,我的经验法则是在绝对必须使用lambda(或其等价物,如
functools.partial
)之前,永远不要使用lambda

首先,代码需要清晰易读。它的阅读方式比它的编写或修改方式更频繁,所以除非有令人信服的理由,否则您应该优化可读性

我会这样写代码:

class Something(...):
    def __init__(self, ...):
        ...
        self.menu_main_top_evaluation.add_command(
            label=self.test_me, command=self._test_me
        )
        ...

    def _test_me(self):
        if self.file_data_for_processing:
            do_something()
        else:
            do_something_else()

注意:选择使用
\uu
前缀纯粹是为了说明目的。前导下划线有助于说明这是一个类专用的函数,但您当然可以使用任何名称。提出一个对您有意义的命名约定是一个好主意,这样就可以很容易地记住哪些功能与哪些菜单项关联

把所有这些代码塞进lambda有什么意义?如果菜单项调用一个简单的命令,然后将所有逻辑放在该命令中,那么代码将更易于维护和调试。在这里使用lambda只会使代码更难理解。@BryanOakley好的。。。