как внести изменения в переменную, которые были сделаны в функции, влияют на переменную глобально python - PullRequest
0 голосов
/ 09 января 2019

Я делаю программу на python, которая использует модули tkinter и cryptography, которые шифруют и дешифруют текст с помощью интерфейса. Моя проблема с моим классом, который я использую экземпляр в основной программе. Проблема в том, что изменения, внесенные в глобальную переменную, не влияют на переменную вне ее области видимости. Я знаю, что это плохая практика, но я не могу придумать способ сделать это без этого, потому что мне нужно выполнить шифрование в функции и мне нужна отдельная функция для расшифровки сообщения. У меня в основном есть две кнопки, которые вызывают эти функции. Если бы вы могли думать о другом пути, я был бы очень благодарен. Также ошибка «NameError: имя 'token' не определено»

import tkinter
from cryptography.fernet import Fernet

global token

class Cryptography:

    def encrypt(self, string):
        byteString = str.encode(string)
        token = f.encrypt(byteString)
        w.insert(tkinter.INSERT, token.decode() + "\n")
        w.pack()

    def decrypt(self):
        try:
            decrypted = f.decrypt(token)
        except NameError:
            w.insert(tkinter.INSERT, "you didn't yet encrypt anything\n")
            w.pack()
        decrypted = f.decrypt(token)
        dsAsString = decrypted.decode("utf-8")
        w.insert(tkinter.INSERT, dsAsString + "\n")

Ответы [ 2 ]

0 голосов
/ 09 января 2019

вы определяете глобальный не в том месте. Определение global в глобальном пространстве имен ничего не делает. Вы должны определить global в функции / методе напрямую. Тем не менее, вы не должны использовать global с классом. Вместо этого переместите токен в класс и вместо этого используйте его как атрибут класса.

import tkinter
from cryptography.fernet import Fernet


class Cryptography:
    def __init__(self):
        self.token = ''

    def encrypt(self, string):
        byteString = str.encode(string)
        self.token = f.encrypt(byteString)
        w.insert(tkinter.INSERT, self.token.decode() + "\n")
        w.pack()

    def decrypt(self):
        try:
            decrypted = f.decrypt(self.token)
        except NameError:
            w.insert(tkinter.INSERT, "you didn't yet encrypt anything\n")
            w.pack()
        decrypted = f.decrypt(self.token)
        dsAsString = decrypted.decode("utf-8")
        w.insert(tkinter.INSERT, dsAsString + "\n")
0 голосов
/ 09 января 2019

Вы можете объявить свою переменную, используя self, чтобы вы могли напрямую обращаться к ней в других методах вашего класса, так как encrypt и decrypt являются методами, принадлежащими к одному и тому же классу.

class Cryptography:

    def encrypt(self, string):
        byteString = str.encode(string)
        self.token = f.encrypt(byteString) # <--- self type here
        w.insert(tkinter.INSERT, token.decode() + "\n")
        w.pack()

    def decrypt(self):
        try:
            decrypted = f.decrypt(self.token) # <--- self.token here
        except NameError:
            w.insert(tkinter.INSERT, "you didn't yet encrypt anything\n")
            w.pack()
        decrypted = f.decrypt(self.token) # <---- self.token used here
        dsAsString = decrypted.decode("utf-8")
        w.insert(tkinter.INSERT, dsAsString + "\n")

В качестве альтернативы, объявление global должно быть сделано в функции decrypt

def decrypt(self):
        global token
        try:
            decrypted = f.decrypt(token)
        except NameError:
            w.insert(tkinter.INSERT, "you didn't yet encrypt anything\n")
            w.pack()
        decrypted = f.decrypt(token)
        dsAsString = decrypted.decode("utf-8")
        w.insert(tkinter.INSERT, dsAsString + "\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...