如何将Tkinter中嵌套的get_entry()函数移到外部并正常调用?
如何将Tkinter嵌套函数移到外部并正常调用
完全可以把get_entry()移到convertFiles()外部,核心是把它依赖的变量显式作为参数传入,下面是具体的修改步骤和代码示例:
步骤1:将get_entry()移到外部并添加参数
把原来嵌套在convertFiles()里的get_entry()抽出来,将它依赖的passp_entry、pass_files、decrypted_data、newWindow都作为函数参数:
def get_entry(passp_entry, pass_files, decrypted_data, newWindow): passp = passp_entry.get() if passp: for x in range(len(pass_files)): command1 = ["gpg", "-d", "--quiet", "--yes", "--pinentry-mode=loopback", f"--passphrase={passp}", f'{pass_files[x]}.gpg'] out = subprocess.check_output(command1, universal_newlines=False) decrypted_data.append(out) print('Asymmetric decryption is complete.') newWindow.destroy()
步骤2:在convertFiles()中通过lambda传递参数
Tkinter按钮的command参数无法直接带参,所以用lambda来包装get_entry(),并把当前作用域的变量传进去:
# 替换原来的add_button定义 add_button = tk.Button(newWindow, text='Enter', command=lambda: get_entry(passp_entry, pass_files, decrypted_data, newWindow))
为什么这样可行?
原来的嵌套函数是通过闭包自动捕获外层convertFiles()的变量,现在用lambda手动把这些变量传递给外部的get_entry(),效果完全一致,但代码结构更扁平,符合良好的编程规范。
如果你的GUI项目规模较大,更推荐用类来封装所有组件和相关变量:把convertFiles()变成类的方法,pass_files、decrypted_data作为类的实例属性,get_entry()也作为类方法,这样不需要手动传参,直接通过self.xxx访问变量,代码维护性会更高。
内容的提问来源于stack exchange,提问作者Oguz Gokyuzu
相关产品推荐
相关产品推荐

