Pull to refresh

Пишем простой счётчик уникальных слов на Python с GUI на Tkinter

Reading time 3 min
Views 24K
Данная статья написана для тех, кто только начал изучать Python. В ней я пошагово опишу создание простого счетчика слов из txt-файлов, применяя Tkinter. Исходный код написан под Python 2.7, в конце статьи я добавлю несколько комментариев относительно того, как перенести его под 3.6

С чего начинаем?


Никаких незаурядных лестниц в программе не будет, так что рекомендую писать в IDLE; конечно же, без проблем можно писать и в PyCharm'е, и в Эклипсе.

Время создать первую и последнюю функцию, которая, собственно, будет выполнять все подсчёты:

def counter():
    with open(filename) as file:    #открываем через менеджер контекста, filename определим позже
        text = file.read()    #считываем содержимое
    text = text.replace("\n", " ")
    text = text.replace(",", "").replace(".", "").replace("?", "").replace("!", "").replace("—", "")
    text = text.lower()    #убираем верхний регистр
    words = text.split()    #создаем в список, где каждый элемент — слово

Итак, что выполняет эта функция? Всё очевидно: открывает файл, считываем содержимое, убирает всякие символы и создает список из содержимого файла. Не стоит забывать убрать верхний регистр методом lower для корректной дальнейшей проверки на повторение слов. Дальше мы будем обрабатывать этот список. Фактически, считав длину этого списка функцией len, нам уже будет известно количество слов.

Количество уникальных слов


Чтобы посчитать кол-во уникальных слов, создадим ещё один список, в который будет через цикл заносить слова, которых ещё в нём не было:

nonrep_words = list()
    for word in words:
        if word in nonrep_words:    #проверка, "есть ли данный элемент уже в списке?"
            pass    #если есть, то ничего не делаем
        else:
            nonrep_words.append(word)    #если нет, то добавляем

Далее мы просто будет считывать длину списка nonrep_words.

Графическая оболочка


Для начала нам следует подключить соответствующие модули в нашу программу:

import Tkinter, Tkconstants, tkFileDialog
from Tkinter import *

Теперь после определения нашей главной функции напишем код, который будет отображать главное окно, название нашей программки, кнопку «Импортировать файл» и поле вывода:

root = Tk()    #создаем окно

frame = Frame(root)    #используем фрейм для позиционирования
frame.grid()    #используем упаковщик grid

title = Label(frame, text="Word counter")    #название программы
title.grid(row=1, column=1)    #упаковываем grid'ом, позицию элементов можно менять, изменяя параметры row и column

import_btn = Button(frame, text="Import file...", command=counter)    #создаём кнопку
import_btn.grid(row=2, column=1, pady=4)

output = Text(frame, width=45, height=3)    #создаём поле вывода
output.grid(row=4, columnspan=3)   

root.mainloop()    #запускаем цикл обработки событий

Вообще-то можно и не использовать фрейм для кнопки, лейбла и текстового поля, но если вы захотите на досуге добавить в дальнейшем ещё несколько каких-либо функций, то фрейм будет полезен для позиционирования.
При создании кнопки мы забиндили её на функцию counter.

Импорт файла и вывод


В начало определения функции counter добавим строчки:

output.delete("0.0","end")
filename = tkFileDialog.askopenfilename()

Здесь всё просто: чистим поле вывода методом delete, затем открываем файл методом askopenfilename и передаём его имя переменной filename.

Далее в конец функции добавим:

output.insert("end","Amount of words: %d\n" % len(words))
output.insert("end","Amount of nonrepeatable words: %d\n" % len(nonrep_words))

Здесь мы выводим длину двух списков: списка всех слов и списка уникальных слов.

Весь код программы:

import Tkinter, Tkconstants, tkFileDialog
from Tkinter import *

def counter():
    output.delete("0.0","end")
    filename = tkFileDialog.askopenfilename()
    with open(filename) as file:
        text = file.read()
    text = text.replace("\n", " ")
    text = text.replace(",", "").replace(".", "").replace("?", "").replace("!", "").replace("—", "")
    text = text.lower()
    words = text.split()
    nonrep_words = list()
    for word in words:
        if word in nonrep_words:
            pass
        else:
            nonrep_words.append(word)
    output.insert("end","Amount of words: %d\n" % len(words))
    output.insert("end","Amount of nonrepeatable words: %d\n" % len(nonrep_words))

root = Tk()

frame = Frame(root)
frame.grid()

title = Label(frame, text="Word counter")
title.grid(row=1, column=1)

import_btn = Button(frame, text="Import file...", command=counter)
import_btn.grid(row=2, column=1, pady=4)

output = Text(frame, width=45, height=3)
output.grid(row=4, columnspan=3)

root.mainloop()

Для версии 3.6


Для данной версии питона должны быть внесены следующие изменения:

  • При подключении модулей tkinter пишем с маленькой буквы; tkFileDialog убираем и пишем вместо него from tkinter import filedialog
  • Соответственно, при импорте файла tkFileDialog.askopenfilename заменяем на filedialog.askopenfilename
  • Возможно, потребуется дописать encoding='utf-8' при открытии файла через менеджер
    контекста
Tags:
Hubs:
+6
Comments 10
Comments Comments 10

Articles