在 Python 中引用另一个函数内的变量

Refer to a variable inside another function in Python

目的是让用户通过

选择文件
select_file_en

然后将通过

加密
encrypt

我希望程序将所选文件的文件名保存在一个变量中,该变量可以被加密部分访问。 我是新手,所以如果这很容易解决,请告诉我。 代码可以在 https://github.com/KDropZ/NDA/blob/main/main.py 找到,目前还不是最终版本。 当我 运行 加密部分时,我得到以下错误,所以我猜我“调用”变量的方式似乎是错误的?

Exception in Tkinter callback Traceback (most recent call last):  
File "/usr/lib/python3.8/tkinter/__init__.py", line 1892, in __call__
    return self.func(*args) TypeError: encrypt() missing 1 required positional argument: 'filename'

附加信息:Python 3.8.10,Tkinter 8.6,Ubuntu OS

代码示例


import tkinter as tk
from tkinter import ttk
import tkinter.font as font
from tkinter import filedialog as fd
from tkinter.messagebox import showinfo
import os

def select_file_en():
    filetypes = (
        ('All files', '*.*'),       
        )

    filename = fd.askopenfilename(
        title='Choose a file to encrypt',
        initialdir='/',
        filetypes=filetypes)

    showinfo(
        title='Selected File',
        message=filename
        )

def encrypt(filename):
    to_encrypt = open(filename, "rb").read()
    size = len(to_encrypt)
    key = os.urandom(size)
    with open(filename + ".key", "wb") as key_out:
        key_out.write(key)
        encrypted = bytes(a^b for (a,b) in zip(filename, key))
    with open(filename, "wb") as encrypted_out:
        encrypted_out.write(encrypted)

问题在第 127 行:

tk.Button(root, cursor='hand2', text='Encrypt file', font=buttonFont, bg='#FF6D6D', fg='#ffffff', command=encrypt).place(anchor='nw', relx='0.78', rely='0.12', x='0', y='0')

您在单击按钮 (command=encrypt) 时调用了 encrypt(filename) 函数,但您没有提供文件名!这也是您的错误消息所说的:missing 1 required positional argument: 'filename'.

您需要找到一种方法来为 tkinter 按钮中的函数提供一个变量:look here.

基本上,你需要保存select_file_en()中选择的文件名到一个变量(我们称之为my_filename),然后使用lambda函数(ELI5:一个小函数,经常用在另一个函数中)在tkinter按钮中使用的命令中传递变量:

command= lambda: encrypt(my_filename)