Подскажите как ввести данные с помощью tkinter

widepeepoHappy

Новичок
Пользователь
Янв 24, 2021
2
0
1
Подскажите как ввести данные в поле ввода и вывести результат в новом окне, а не в консоли.
Python:
from collections import Counter
from tkinter import *
from tkinter import messagebox
 

def divide_table(table):
    optimal_difference = sum(table.values())
    optimal_index = 0

    for i in range(len(table)):
        current_difference = abs(sum(list(table.values())[:i]) - sum(list(table.values())[i:]))

        if current_difference < optimal_difference:
            optimal_difference = current_difference
            optimal_index = i
    return dict({item for i, item in enumerate(table.items()) if i < optimal_index}), \
           dict({item for i, item in enumerate(table.items()) if i >= optimal_index})


def shenon_get_codes(table, value='', codes={}):
    if len(table) != 1:
        a, b = divide_table(table)
        shenon_get_codes(a, value + '0', codes)
        shenon_get_codes(b, value + '1', codes)
    else:
        codes[table.popitem()[0]] = value
    return codes


def decode_symbol(table, code, index=0):
    if len(table) != 1:
        a, b = divide_table(table)
        if code[index] == '0':
            return decode_symbol(a, code, index + 1)
        else:
            return decode_symbol(b, code, index + 1)
    else:
        return table.popitem()[0]

data = input('Шифруемая строка: ')
counter = Counter(data)


# Символы первичного алфавита по убыванию вероятностей.
sorted_freq = sorted(set(data), key=lambda letter: counter[letter], reverse=True)
sorted_freq_dict = {letter: counter[letter] for letter in sorted_freq}

code_table = shenon_get_codes(sorted_freq_dict)  # таблица символов со значениями частоты

print(sorted_freq_dict)
for symbol, key in sorted(code_table.items(), key=lambda item: len(item[1])):
    print(symbol, key, sep=': ')

encoded = [code_table[letter] for letter in data]
encoded_bits = ''.join(encoded)
encoded_str = [chr(int(encoded_bits[i:i + 8], 2)) for i in range(0, len(encoded_bits), 8)]

print('исходная строка ({} bits): '.format(len(data) * 8), data)
print('сжатая строка ({} bits): '.format(len(encoded_str) * 8), ''.join(encoded_str))
print('данные: {}'.format(encoded_bits))

index = 0
decoded_str = ''

while index < len(encoded_bits):
    current = decode_symbol(sorted_freq_dict, encoded_bits, index)  # расшифровать очередной символ
    decoded_str += current             # добавить его в результат
    index += len(code_table[current])  # перейти на следующий


def ki ():
    messagebox.showinfo("ВЫВОД", message.get())

import tkinter as tk
win=Tk()
win.geometry('300x100')
win.title('test')

message=StringVar()

message_entry = Entry(textvariable=1)
message_entry.place(relx=.5, rely=.5, anchor="c")

btn1=tk.Button(win, text='Ввод', command=ki)
btn1.pack()

win.mainloop()
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 663
474
83
наверное так вы хотели
Python:
from collections import Counter
from tkinter import messagebox
import tkinter as tk


def divide_table(table):
    optimal_difference = sum(table.values())
    optimal_index = 0

    for i in range(len(table)):
        current_difference = abs(sum(list(table.values())[:i]) - sum(list(table.values())[i:]))

        if current_difference < optimal_difference:
            optimal_difference = current_difference
            optimal_index = i
    return dict({item for i, item in enumerate(table.items()) if i < optimal_index}), \
           dict({item for i, item in enumerate(table.items()) if i >= optimal_index})


def shenon_get_codes(table, value='', codes={}):
    if len(table) != 1:
        a, b = divide_table(table)
        shenon_get_codes(a, value + '0', codes)
        shenon_get_codes(b, value + '1', codes)
    else:
        codes[table.popitem()[0]] = value
    return codes


def decode_symbol(table, code, index=0):
    if len(table) != 1:
        a, b = divide_table(table)
        if code[index] == '0':
            return decode_symbol(a, code, index + 1)
        else:
            return decode_symbol(b, code, index + 1)
    else:
        return table.popitem()[0]


def ki():
    data = message_entry.get()
    counter = Counter(data)
    sorted_freq = sorted(set(data), key=lambda letter: counter[letter], reverse=True)
    sorted_freq_dict = {letter: counter[letter] for letter in sorted_freq}

    code_table = shenon_get_codes(sorted_freq_dict)  # таблица символов со значениями частоты

    print(sorted_freq_dict)
    for symbol, key in sorted(code_table.items(), key=lambda item: len(item[1])):
        print(symbol, key, sep=': ')

    encoded = [code_table[letter] for letter in data]
    encoded_bits = ''.join(encoded)
    encoded_str = [chr(int(encoded_bits[i:i + 8], 2)) for i in range(0, len(encoded_bits), 8)]

    print('исходная строка ({} bits): '.format(len(data) * 8), data)
    print('сжатая строка ({} bits): '.format(len(encoded_str) * 8), ''.join(encoded_str))
    print('данные: {}'.format(encoded_bits))

    index = 0
    decoded_str = ''

    while index < len(encoded_bits):
        current = decode_symbol(sorted_freq_dict, encoded_bits, index)  # расшифровать очередной символ
        decoded_str += current  # добавить его в результат
        index += len(code_table[current])  # перейти на следующий
    messagebox.showinfo("ВЫВОД", str(sorted_freq_dict) + '\nисходная строка ({} bits): {}\n'
                        'сжатая строка ({} bits): {}\n'
                        'данные: {}'.format(len(data) * 8, data, len(encoded_str) * 8, ''.join(encoded_str), encoded_bits))

win = tk.Tk()
win.geometry('300x100')
win.title('test')

message = tk.StringVar()

message_entry = tk.Entry(textvariable=1)
message_entry.place(relx=.5, rely=.5, anchor="c")

btn1 = tk.Button(win, text='Ввод', command=ki)
btn1.pack()

win.mainloop()
 

widepeepoHappy

Новичок
Пользователь
Янв 24, 2021
2
0
1
Именно так. Спасибо. :)(y)
 

Форум IT Специалистов