Цель состоит в том, чтобы пользователь выбрал файл через
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.
Пример кода
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)
Редактировать: Решено!
Я использовал как глобальные переменные, так и лямбда, чтобы решить эту проблему. Все работает как часы, спасибо за помощь!<3
Используйте глобальную переменную. Назначьте глобальную переменную в select_file_en
и используйте ее в encrypt
Каждая функция-член класса должна иметь один позиционный параметр, обычно называемый self
.
проблема в строке 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')
Вы вызываете функцию encrypt(filename)
нажатием кнопки (command=encrypt
), но не указываете имя файла! Это также то, что говорит ваше сообщение об ошибке: missing 1 required positional argument: 'filename'
.
Вам нужно найти способ предоставить функцию в кнопке tkinter с переменной: Смотри сюда.
в основном вам нужно спасти имя файла, выбранное в select_file_en()
, в переменную (давайте назовем его my_filename
), а затем используйте функцию lambda
(ELI5: небольшая функция, часто используемая в другой функции), чтобы передать переменную в используемой команде в кнопке tkinter:
command= lambda: encrypt(my_filename)
Пожалуйста, опубликуйте здесь минимальный воспроизводимый пример, а не ссылку на ваш репозиторий github.