Python графический интерфейс в консоли

Python и графический интерфейс для утилит командной строки Network Security Services

image

Пакет Network Security Services (NSS) представляет собой набор библиотек, используемых при кроссплатформенной разработке защищенных клиентских и серверных приложений. Приложения построенные с использование NSS могут использовать TLS от v1.0 до TLS v1.3, PKCS #5, PKCS #7, CMS, PKCS #11, PKCS #12, S/MIME, сертификаты X.509 v3, OCSP и другие стандарты обеспечения безопасности. По своей функциональной мощности в области криптографии и PKI с NSS может сравниться разве что OpenSSL. Но при этом пакет NSS имеет одно неоспоримое преимущество перед OpenSSL, а именно имеет хранилище, в котором хранятся корневые сертификаты, сертификаты сторонних пользователей, информация о подключенных аппаратных ускорителях, токенах, смарткартах с интерфейсом PKCS#11.

В настоящее время пакет NSS поддерживает стандарт PKCS#11 v.2.40.

В разработку NSS внесли свой вклад AOL, Red Hat, Sun Microsystems / Корпорация Oracle, Google и другие компании и индивидуальные вкладчики. Mozilla предоставила хранилище для исходного кода.

Пакет NSS широко используется, в том числе в продуктах Mozilla, включая браузер Firefox (в том числе и на платформе Android), почтовый клиент Thunderbird и интегрированный пакет Seamonkey.

Пакет NSS, также как и OpenSSL, предоставляет возможность использования для реализации различных функций PKI (генерация ключей, выпуск сертификатов x509v3, работа с электронной подписью, поддержка TLS и т.д.) утилиты командной строки. В отличие от OpenSSL, где функции PKI реализуются одной утилитой openssl, пакет NSS предоставляет целый набор утилит. Так для работы с сертификатами имеется утилита certutil, для работы с защищенными контейнерами PKCS#12 используется утилита pk12util, для работы с электронной подписью используются утилиты p7sign, p7verify, p7content и т.д. Если говорить об операционных системах семейства Linux, то пакет NSS входит в обязательную поставку и все эти утилиты предустановлены.

Читайте также:  Все визуальные html редакторы

Как уже говорилось, NSS имеет встроенное хранилище, которое включает в свой состав три базы данных:

bash-4.3$ ls -l *.db cert8.db key3.db secmod.db bash-4.3$

В первой базе данных cert8.db хранятся корневые сертификаты и, как правило, сертификаты сторонних пользователей, которые используются, например, для шифрования электронной почты или файлов на сертификате получателя. В БД key3.db хранятся закрытые ключи. И, наконец, в БД secmod.db хранится информация о подключаемых токенах/смарткартах с интерфейсом PKCS#11. Управляет этой базой утилита modutil, которая позволяет добавить или удалить модуль PKCS#11. Подключение модуля заключается в указании пути к библиотеке PKCS#11 модуля и задании его nickname. Указание пути к каталогу, в котором размещается хранилище, является неотъемлемым параметром любой утилиты NSS. В одних утилитах он задается как «-d », в других как «-dbdir ». Создается хранилише утилитой modutil:

Отметим, что такие хранилища есть во всех проектах, построенных на NSS, включая Firefox, Thunderbird, Seamonkey.

В статье было выражено пожелание написать графические оболочки для утилит командной строки OpenSSL и NSS. И вот настала пора для NSS. Первый вопрос: в какой среде разрабатывать? В предыдущих статьях была рассмотрена разработка пользовательского графического интерфейса в среде Tcl/Tk с использованием различных конструкторов. Разработку графического пользовательского интерфейса для пакета NSS было решено вести на скриптовом языке Python. В качестве графического пакета в целях обеспечения преемственности с пакетом Tk был выбран пакет Tkinter.

Теперь необходимо было выбрать инструментарий для проектирования графического интерфейса. Первым был рассмотрен пакет Rapid-TK :

image

В целом пакет оставил хорошее впечатление, которое оправдывает свое название пакета: Rapid – быстрый. И все же отметим два недостатка. Первое неодобство связано с тем, что на мольберте размещаются только иконки виджетов, а не сами виджеты (см. рис.). И чтобы увидеть реальную картинку, приходится очень часто выполнять проект. Второй недостаток связан с размещением виджетов в окне. В Rapid-TK в качестве упаковщика используется упаковщик Pack (размещение по направлениям), что очень затрудняет выравнивание виджетов в окне в отличие от упаковщиков grid (по сетке, аналогично морскому бою) и place (по координатам). Хотя использование frame позволяет добиться нужного эффекта:

image

Однако после начала проектирования стало ясно, что количество виджетов и окон в проекте растет и оптимальным стало бы использование технологии Notebook (блокнот, записная книжка):

image

И тут ждал неприятный сюрприз: конструктор Rapid-TK не поддерживает работу с Notebook, хотя сам виджет подключается. И тогда был найден констуктор Page – автоматический генератор GUI для Python. Совсем неожиданным и приятным сюрпризом было то, что констуктор Page построен на базе Visual Tcl . Это и стало самым весомым аргументом:

image

Если приглядеться, то окна конструктора Page как близнецы окон констуктора Visual Tcl. И все же без подвоха не обошлось: создаваемый генератором скрипт на Python не хотел выполняться из-за использования «великого, могучего, правдивого и свободного русского языка!» (И.С. Тургенев). Но все разрешилось просто, достаточно оказалось добавить в файл gui_pyton_gen.tcl после 418 строки следующий код:

Теперь, если заглянуть в генерируемый код на Python, то второй строкой в нем окажется эта директива:

! /usr/bin/env python # -*- coding: utf-8 -*- # # GUI module generated by PAGE version 4.9 # In conjunction with Tcl version 8.6 # Aug 14, 2017 11:39:19 AM import sys try: from Tkinter import * except ImportError: from tkinter import * . . .

Что еще? Констуктор Page не предполагает, что проект будет многооконным (см. выше Rapid). В нашем случае многооконность, с одной стороны, заменена на Notebook. А с другой, в первую очередь это касается ввода PIN-кода или пароля, мы использовали виджет Labelframe, который то скрывался (self1.LabelPSW6.place_forget()):

image

то появлялся для ввода PIN-кода или пароля:

self1.LabelPSW6.place(relx=0.05, rely=0.59, relheight=0.3, relwidth=0.88)

И все же дополнительное окно потребовалось, например, для просмотра содержимого сертификата из базы данных или электронной подписи:

image

В данном случае задача решается просто. Создается новый проект в конструкторе Page и полученный код «ручками» включается в основную ветку. Чтобы увидеть все хитросплетения разработки графического пользовательского интерфейса для утилит командной строки в Python на Tkinter, достаточно установить конструктор Page, загрузить проект nss_my и внимательно его проанализировать. В качестве возможностей данного проекта приведем скриншот извлечения оригинала файла из файла с присоединенной подписью (утилита p7content):

image

И наконец, мы хотим на выходе получить не скрипт на Python, а бинарный код. Для этого мы использовали проект Nuitka, который скрипт на Python конвертирует в C-код, а затем транслирует. Эффект превзошел все ожидания. Поставьте пакет Nuitka, положите в папку bin сгенерированные конструктором Page два Python-овских скрипта nss_my.py и nss_my_support.py и выполните команду:

#nuitka –recurse-all nss_my.py

В итоге вы получите бинарный модуль nss_my.exe. Пусть вас не смущает окончание, смело запускайте его. В качестве подключаемого модуля PKCS#11, по крайней мере на этапе тестирования, удобно использовать облачный токен.

Источник

Графический интерфейс на Python за 5 минут

image

Python легко использовать. В нем вы можете найти огромное количество библиотек для чего угодно. И это его основное преимущество. Из нескольких строк кода вы ничего не сделаете. Если вам нужны скрипты для личного пользования или для технически подкованной аудитории, то вам даже не придется думать о графическом интерфейсе.

Однако иногда ваша целевая аудитория не сильно подкована технически. Люди не против использовать ваши скрипты на Python до тех пор пока им не нужно смотреть на одну строку кода. В таком случае скриптов командной строки будет недостаточно. В идеале вам нужен графический интерфейс. Цель этого поста использовать только Python.

Библиотеки Python, которые можно использовать для графического интерфейса

По сути, есть 3 большие библиотеки Python для графического интерфейса; Tkinter, wxPython и PyQT. Рассматривая их, я не нашел там ничего из того, что мне нравится в Python. Библиотеки Python, как правило, очень хорошо абстрагируются от супер-технических моментов. Если бы мне нужно было работать с объектно-ориентированным программированием, я мог бы с таким же успехом загрузить Java или .Net.

EDISON Software - web-development

Статья переведена при поддержке компании EDISON Software, которая заботится о здоровье программистов и их завтраке, а также разрабатывает программное обеспечение на заказ.

Однако, к счастью, я наткнулся на четвёртый вариант, который был мне по душе. Это PySimpleGUI, я до сих пор ей пользуюсь. Как ни странно, эта библиотека использует все 3 популярные библиотеки, о которых шла речь выше, но при этом абстрагируется от супер технических моментов

Давайте погрузимся в эту библиотеку и изучим ее, одновременно решая реальную проблему.

Проверьте два одинаковых файла

Я рассказал как это сделать в своей статье “3 быстрых способа сравнить данные в Python”. Мы можем использовать первый раздел, проверку целостности данных, чтобы попытаться создать пользовательский интерфейс.

Запрограммируйте графический интерфейс

Чтобы создать графический интерфейс, можно использовать этот код:

import PySimpleGUI as sg layout = [ [sg.Text('File 1'), sg.InputText(), sg.FileBrowse(), sg.Checkbox('MD5'), sg.Checkbox('SHA1') ], [sg.Text('File 2'), sg.InputText(), sg.FileBrowse(), sg.Checkbox('SHA256') ], [sg.Output(size=(88, 20))], [sg.Submit(), sg.Cancel()] ] window = sg.Window('File Compare', layout) while True: # The Event Loop event, values = window.read() # print(event, values) #debug if event in (None, 'Exit', 'Cancel'): break

image

Подключаем логику

Когда есть пользовательский интерфейс, легко понять, как подключить остальную часть кода. Нам просто нужно следить за тем, что вводит пользователь и действовать соответственно. Мы можем очень легко сделать это с помощью следующего кода:

import PySimpleGUI as sg import re import hashlib def hash(fname, algo): if algo == 'MD5': hash = hashlib.md5() elif algo == 'SHA1': hash = hashlib.sha1() elif algo == 'SHA256': hash = hashlib.sha256() with open(fname) as handle: #opening the file one line at a time for memory considerations for line in handle: hash.update(line.encode(encoding = 'utf-8')) return(hash.hexdigest()) layout = [ [sg.Text('File 1'), sg.InputText(), sg.FileBrowse(), sg.Checkbox('MD5'), sg.Checkbox('SHA1') ], [sg.Text('File 2'), sg.InputText(), sg.FileBrowse(), sg.Checkbox('SHA256') ], [sg.Output(size=(88, 20))], [sg.Submit(), sg.Cancel()] ] window = sg.Window('File Compare', layout) while True: # The Event Loop event, values = window.read() # print(event, values) #debug if event in (None, 'Exit', 'Cancel'): break if event == 'Submit': file1 = file2 = isitago = None # print(values[0],values[3]) if values[0] and values[3]: file1 = re.findall('.+:\/.+\.+.', values[0]) file2 = re.findall('.+:\/.+\.+.', values[3]) isitago = 1 if not file1 and file1 is not None: print('Error: File 1 path not valid.') isitago = 0 elif not file2 and file2 is not None: print('Error: File 2 path not valid.') isitago = 0 elif values[1] is not True and values[2] is not True and values[4] is not True: print('Error: Choose at least one type of Encryption Algorithm') elif isitago == 1: print('Info: Filepaths correctly defined.') algos = [] #algos to compare if values[1] == True: algos.append('MD5') if values[2] == True: algos.append('SHA1') if values[4] == True: algos.append('SHA256') filepaths = [] #files filepaths.append(values[0]) filepaths.append(values[3]) print('Info: File Comparison using:', algos) for algo in algos: print(algo, ':') print(filepaths[0], ':', hash(filepaths[0], algo)) print(filepaths[1], ':', hash(filepaths[1], algo)) if hash(filepaths[0],algo) == hash(filepaths[1],algo): print('Files match for ', algo) else: print('Files do NOT match for ', algo) else: print('Please choose 2 files.') window.close() 

Он даст нам такой результат:

image

Заключительные мысли

Может это и не самый красивый пользовательский интерфейс, но PySimpleGUI позволяет вам быстро разворачивать простые пользовательские интерфейсы Python и делиться ими с кем угодно. Код, который вам нужен для этого, прост и легко читается. У вас все еще будет проблема запуска кода для получения пользовательского интерфейса. Из-за этого могут возникнуть сложности с совместным использованием кода. Советую скачать что-то вроде PyInstaller, который превратит ваш скрипт на python в .exe файл. Люди смогут запустить его просто нажав на него дважды.

Источник

Оцените статью