Обучение слепой печати linux

Программа-помощник для освоения слепой печати на клавиатуре в Linux

Хочу показать и рассказать о небольшой программке, которая принесла пользу.

Однажды на работе мне написал друг. Диалог у нас состоялся примерно следующий:
— Привет, я тут обучаюсь технике слепой печати. Дело в том, что на линуксе нет программки, которая могла бы мне помочь. В общем, может ты сможешь быстренько написать такую?

Так как помочь другу — святое дело, да и задача выглядела интересной, помочь я согласился.

В итоге получилось вот что:

Кому интересно, подробности ниже

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

Вместе с другом сделали постановку задачи:

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

Это помогает выработать рефлекс смотреть на монитор во время печати на клавиатуре.

  1. Реализовать её очень быстро;
  2. Показывать нажатые клавиши в режиме реального времени;
  3. «Переключать раскладки» в окне при переключении языка клавиатуры;
  4. Производить настройку программы через текстовый конфигурационный файл.
  1. Режим «залипания» последней нажатой клавиши (помогает сообразить куда нажимать пальцами дальше);
  2. Работа с клавишей shift;
  3. Возможность пометки цветом позиций для пальцев на клавиатуре;
  4. Возможность настройки шрифта;
  5. Возможность настройки ширины кнопок;
  6. Автоматическое сокрытие содержимого окна при наведении мышки.

Общее описание внутренностей программы:

Для чтения клавиш используется найденная в google строчка на bash, позволяющая читать клавиши, нажимаемые на клавиатуре через утилиту xinput. Данный способ выбран в угоду пункту 1 требований. Процесс чтения символов запускается в отдельном потоке. Так же реализовано и чтение языка раскладки (опять таки пункт 1). Выдача информации о нажатых кнопках производится в очередь. Работа с очередью в главном окне программы производится путем периодического вызова функции periodicCall. Таким образом два потока пишут в очередь, один поток читает.
Завершение работы программы производится своеобразно — через статусные переменные в потоках.

Работа с настройками программы

Настройки программы загружаются и хранятся в экземпляре класса ConfigManager. Чтение из главноего текстового файла настроек производится с помощью ConfigParser. Данный модуль позволяет использовать похожий на INI формат конфигурационных файлов. В конструкторе класса производится проверка существования конфигурационного файла, расположенного по пути «~/.key_trainer/program.conf». Если его нет, программа читает файл program.conf, расположенный в текущей папке с программой.

import os . filename='program.conf' home = os.path.expanduser("~") if os.path.isfile(home+'/.key_trainer/'+filename): filename=home+'/.key_trainer/'+filename . 

ConfigParser — замечательный модуль. Можно считать названия всех секций, а также считать ключи с их значениями внутри секций как кортежи (tuple). Так, например, реализовано считывание названий секций, и ключей в секции «KEYBOARD SETTINGS».

 from ConfigParser import RawParser . myParser=RawConfigParser(allow_no_value=True) myParser.read(path_to_file) # Получаем секции self.sections = myParser.sections() # Используем генератор чтобы вытащить ключи, заданные в секции KEYBOARD SETTINGS keyboard_settings_keys=[x[0] for x in myParser.items("KEYBOARD SETTINGS")] 

Помимо главного конфигурационного файла есть второй не менее важный — «keyboard.conf». Он используется для настройки отображаемых кнопок, а именно кода кнопки, текста на кнопке (с шифтом и в раскладках), положения кнопки. Убирая/добавляя записи в этот файл можно менять количество и качество кнопок (и строк с кнопками) в главном окне программы.

Читайте также:  Ошибка при установки kali linux

В файле содержатся записи в виде:

[код кнопки]:»[строчной символ в английской раскладке],[заглавный символ в английской раскладке],[строчной символ в русской раскладке],[заглавный символ в русской раскладке]»:[номер строки кнопки],[номер столбца кнопки]

Вот несколько записей для примера:

Чтение символов с клавиатуры

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

Чтение символов с клавиатуры производится в два потока. Почему два — потому что на практике так оказалось проще. Один поток читает раскладку клавиатуры, второй нажатые кнопки. Оба потока порождаются через Thread, в каждом потоке затем через subprocess Popen будет запущен соответствующий процесс чтения клавиш или раскладки. Для чтения выходного потока процесса используется subprocess.PIPE. Как только текст пришел в поток выхода процесса, он читается, обрабатывается, и, если нужно, ставится в очередь Queue:

from subprocess import Popen from subprocess import PIPE import threading . def doReadingKeys(self): self.myProcess=Popen('xinput list '+'|'+' grep -Po \'id=\K\d+(?=.*slave\s*keyboard)\' '+'|'+' xargs -P0 -n1 xinput test',shell=True,stdout=PIPE) while self.proc_started: symbol=self.myProcess.stdout.read(1) if symbol in press_release_dict: symbol_pressed=press_release_dict[symbol] while symbol!='\n': symbol=self.myProcess.stdout.read(1) if symbol.isdigit(): symbol_index=symbol_index*10+int(symbol) self.myQueue.put((symbol_index,symbol_pressed)) symbol_index=0 . keysThread=threading.Thread(target=self.doReadingKeys) keysThread.start() . 

Чтобы завершить поток используется переменная класса proc_started. При закрытии главного окна программы она устанавливается в значение False, производится выход из цикла чтения, выполняется завершения процесса чтения клавиш через terminate, а затем wait — для того чтобы дождаться пока процесс завершился.

У данного подхода есть один недостаток — разблокировка(а значит и дальнейшее завершение потока и процесса) метода read, который внутри цикла не произойдет до тех пор, пока что-нибудь не считается с выходного потока процесса myProcess. Но на практике проблем из-за этого не возникало, так как нажимаем мы на кнопки часто.

Читайте также:  Дистрибутив linux для web

Графический интерфейс

Для того чтобы быстро сделать графический интерфейс использовался Tkinter. Данный модуль позволяет легко работать с простыми графическими интерфейсами (окна, кнопки, галочки и т.п.). Класс окна GuiManager на вход, помимо других параметров, принимает класс конфигурации. Из неё берутся настройки кнопок, затем эти кнопки создаются и добавляются на главное окно программы.

from Tkinter import * import tkFont . self.buttonFont=tkFont.Font(family=config.font_name,size=config.font_size) self.boldUnderscoredButtonFont=tkFont.Font(family=config.font_name,size=config.font_size,weight='bold',underline=1) for row_index in xrange(1,config.getNumOfRows()+1): self.gui_rows[int(row_index)]=Frame(master) self.gui_row_buttons[int(row_index)]=[] for button_num in xrange(1,config.getNumOfKeysInRow(row_index)+1): newButton=Button(self.gui_rows[int(row_index)]) if self.config.padx!=-1: newButton.config(padx=self.config.padx) if self.config.pady!=-1: newButton.config(pady=self.config.pady) if (row_index,int(button_num)) in config.key_pos_to_index: self.gui_all_buttons[config.key_pos_to_index[(row_index,int(button_num))]] = newButton self.gui_row_buttons[int(row_index)].append(newButton) newButton.pack(side=LEFT) self.gui_rows[int(row_index)].pack() self.reconfigure_text_on_buttons(config,shift_pressed=0,lang=0) . 

При добавлении кнопок на форму попутно создаются словари с ключами номера строки и значениями — объектом Frame в каждый из которых помещаются кнопки. Как видно из кода, кнопки формируются построчно, по завершении формирования строки виджет кладется в окно методом pack().

Помимо прочего, в класс добавлена функция processQueue, которая со стороны потока графического интерфейса достает из очереди кортежи (tuple) с событиями нажатых кнопок и изменяет внешний вид кнопок — «нажимает» их, «переключает раскладки» и «нажимает» кнопку shift:

 def processQueue(self): while not self.queue.empty(): msg = self.queue.get(0) if msg[0] == -1: # -1 message is for changing language self.currentLang=int(msg[1]) if self.config.debug: print "Changed lang!" self.reconfigure_text_on_buttons(self.config,0,msg[1]) if msg[0] in self.gui_all_buttons: if msg[0] in self.shift_key_codes: self.reconfigure_text_on_buttons(self.config,msg[1],self.currentLang) if msg[1]==1: self.gui_all_buttons[msg[0]].config(relief=SUNKEN) if self.sticky_key_behaviour: if self.last_sticky_button!=msg[0]: self.gui_all_buttons[self.last_sticky_button].config(relief=RAISED) self.last_sticky_button=msg[0] else: if not self.sticky_key_behaviour: self.gui_all_buttons[msg[0]].config(relief=RAISED) if self.config.debug: print msg 

Класс GuiManager инкапсулирован внутрь класса ThreadedClient, который принимает на вход главный поток Tkinter и выставляет вызов функции разбора очереди каждые 20 миллисекунд:

class ThreadedClient: def __init__(self, master): self.master = master self.config=ConfigManager() self.keyTrainer=keyboardStatus(self.config) keyTrainer=self.keyTrainer master.protocol('WM_DELETE_WINDOW', self.kill_and_destroy) self.guiManager=GuiManager(master,self.config,keyTrainer.myQueue,keyTrainer) keyTrainer.begin_scan() self.running = 1 self.periodicCall() def kill_and_destroy(self): self.running = 0 self.keyTrainer.stop_scan() if self.config.debug: print "Stopping scan. " self.master.destroy() def periodicCall(self): self.guiManager.processQueue() if not self.running: # import sys # sys.exit(1) self.kill_and_destroy() self.master.after(20, self.periodicCall) 

Несколько картинок

Окно программы после перенастройки:

При наведении курсора мыши окно программы «уезжает» под заголовок (цвета, которые остаются на белом фоне — артефакты сжатия ролика):

Нажатие клавиши shift и переключение языка:

Заключение

  • Запускаемые со стороны процессы с командами bash для чтения символов;
  • Жестко заданные языки (только русский и английский);
  • Квадратный интерфейс;
  • Работает на Ubuntu и Linux Mint (MATE), на других дистрибутивах не опробована;
sudo apt-get install python-tk 

Запуск программы выполняется скриптом Start.sh из директории с программой.

P.S. Поступил вопрос: сколько времени заняло написание программы? Времени было потрачено в общей сумме часов 6-8, после первых трех было активное тестирование и допиливались всякие детали.

UPD: убрал try/except из обработки очереди со стороны GUI

Читайте также:  Мониторинг сетевых подключений linux

Источник

Какой клавиатурный тренажер лучший для обучения слепой печати?

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

Лучший клавиатурный тренажер

Я не буду делать для вас никаких обзоров. Если вы интересуетесь этой темой, то уже наверняка пробовали и Стамину, и Соло на клавиатуре, и различные онлайн тренажеры.

Мне как-то порекомендовали клавиатурный тренажер VerseQ https://www.verseq.ru и опробовав этот тренажер, я понял, что это то, что нужно.

В чем преимущества VerseQ

  1. Нет программы обучения, в виде определенных уроков. Вы не делаете монотонные упражнения по набору ФЫВА ОЛДЖ, а сразу начинаете работу со всеми клавишами одновременно
  2. Самая фишка — это то, что программа подстраивается под вас и запоминает ошибки, которые вы сделали. После чего выдает вам задания, где вы тренируете именно те клавиши, с которыми у вас чаще всего возникают проблемы.
  3. Скорость обучения гораздо выше по сравнению с конкурентами
  4. Не наказывает за совершенные ошибки в виде повторения одних и тех же заданий
  5. Не пропадает желание обучаться т.к. прогресс на лицо

Это не проплаченный PR программы — это честная и искренняя рекомендация.

VerseQ для Linux

К сожалению, автор программы не сделал версии для Linux. Программу на Линуксе можно запустить лишь через Wine. Для linux есть конечно и нативные программы например Klavaro, но к сожалению там применяется стандартный подход обучения. Есть еще вариант онлайн версии программы, но это совсем не то что и десктоп версия программы.

Рекомендации для быстрого освоения десятипальцевого метода печати

Я как-то спросил человека, у которого скорость печати на высоком уровне, как он обучился. Он ответил, что главное правило — это ВСЕГДА печатать вслепую, даже когда вы пишите письмо или общаетесь в чате.

Вторая рекомендация — это сначала работать на точность , а уж потом, когда освоите все клавиши работать над скоростью .

Ссылки

Тут сделаю подборку, чтобы у вас было с чем сравнить

Выводы

  1. Понять цель — для чего вам это
  2. Ежедневные тренировки с VerseQ
  3. Печатать вслепую всегда и везде
  4. Приоритеты: точность, затем скорость.

Ответьте на вопросы

Какие программы используете вы в Linux или Windows?

Понравился ли вам подход в обучении в VerseQ?

Какая у вас скорость печати?

Ставьте лайки, пишите комментарии и подписывайтесь на мой канал .

Источник

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