在 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)
目的是让用户通过
选择文件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)