The intention is to have a user choose a file via
select_file_en
which will then be encrypted via
encrypt
I want the program to save the filename of the chosen file in a variable, which can be accessed by the encryption part. I'm a newbie so please bare with me if this is easy to fix. Code can be found at https://github.com/KDropZ/NDA/blob/main/main.py and is by far not final at all. When I run the encrypt part I get the following Error, so my way to "call" the variable seems to be wrong I guess?
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'
Additional info: Python 3.8.10, Tkinter 8.6, Ubuntu OS
Code example
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)
Edit: Solved!
I used both, global variables and lambda to solve this problem. Everything works like a charm, thanks for your help!<3
CodePudding user response:
the problem is in line 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')
You call the encrypt(filename)
function on a button click (command=encrypt
), but you do not provide the filename! This is also what your error message says: missing 1 required positional argument: 'filename'
.
You need to find a way to provide the function in the tkinter button with a variable: look here.
basically, you need to save the filename that is chosen in select_file_en()
to a variable (lets call it my_filename
), and then use a lambda
function (ELI5: a small function, often used in another function) to pass the variable in the command used in the tkinter button:
command= lambda: encrypt(my_filename)