Python GUI для шифровальных функций Цезаря - PullRequest
0 голосов
/ 19 января 2020

У меня есть две функции ниже для кодирования и декодирования текста из текстового файла. Сначала я убираю любые символы, отличные от алфавита c, и преобразую текст в нижний регистр. Функция кодирования будет сдвигать каждый символ в тексте на определенное количество мест (number_to_rotate_by). Наконец, функция декодирования будет печатать каждую возможную комбинацию символов с указанным number_to_rotate_by.

Вместо чтения из текстового файла я хотел бы создать GUI с python для приема двух входных данных (строки и целого числа) и вывода текста шифра.

import collections
import string
import re

with open('random.txt','r') as f:
    data = f.read().replace('\n', '')

data_formatted = re.sub('[^A-Za-z]+', '', data.lower())

def encode(rotate_string, number_to_rotate_by):

    lower = collections.deque(string.ascii_lowercase)

    lower.rotate(number_to_rotate_by)

    lower = ''.join(list(lower))

    return rotate_string.translate(str.maketrans(string.ascii_lowercase, lower))

encode(data_formatted,1)

def decode(test_string):
    for i in range(len(string.ascii_lowercase)):
        print(encode(data_formatted, i))

decode(data_formatted)

Ниже приведено то, что я сейчас использую с tkinter. Тем не менее, я получаю следующую ошибку

Traceback (последний вызов был последним): файл «5.py», строка 28, в кнопке = кнопка (текст = «нажать для печати», команда = кодировать (b, 0), fg = 'red'). pack () Файл "5.py", строка 19, в кодировке return rotate_string.translate (str.maketrans (string.ascii_lowercase, lower)) AttributeError: объект 'StringVar' не имеет атрибута "перевод"

Буду признателен за любую помощь.

from tkinter import *
import collections
import string

a=Tk()
a.title('Homework 1')
a.geometry('500x500+300+100')
b=StringVar()

def encode(rotate_string, number_to_rotate_by):
    c=b.get()

    lower = collections.deque(string.ascii_lowercase)

    lower.rotate(number_to_rotate_by)

    lower = ''.join(list(lower))

    return rotate_string.translate(str.maketrans(string.ascii_lowercase, lower))


labl=Label(text='Please write a word or sentence',font=30).pack()

text=Entry(textvariable=b).pack()

button=Button(text='Press to print', command=encode(b,0),fg='red').pack()

a.mainloop()

1 Ответ

0 голосов
/ 20 января 2020

Есть много ошибок.

Основная проблема: StringVar нужно .get(), чтобы получить строку, которая имеет .translate()

b.get().translate(...)

Другое, которое вы можете увидеть в коде и прочитать в комментарии выше.

-

#import from tkinter import * # PEP8: `import *` not preferred
import tkinter as tk
import collections
import string

# --- functions ---

def encode(number_to_rotate_by):

    lower = collections.deque(string.ascii_lowercase)
    lower.rotate(number_to_rotate_by)
    lower = ''.join(list(lower))

    text = entry_text.get()

    result = text.translate(str.maketrans(string.ascii_lowercase, lower))

    #result_label["text"] = result
    result_text.set(result)

# --- main ---

root = tk.Tk()
entry_text = tk.StringVar()
result_text = tk.StringVar()

label = tk.Label(root, text='Please write a word or sentence')
label.pack()

text = tk.Entry(root, textvariable=entry_text)
text.pack()

result_label = tk.Label(root, textvariable=result_text) # label for result
result_label.pack()

button = tk.Button(root, text='Press to print', command=lambda:encode(1))
button.pack()

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...