Reset82
|
Сообщение #1
13 декабря 2014 в 17:53
|
Маньяк
42 |
Вашему вниманию предлагается небольшая утилита, для самоанализа! TypingScreen это альтернатива TypingStatistics под Unix системы, написанная на python с использованием shell скриптов, и полностью предоставляется в исходных кодах. Пример ее работы можно посмотреть на этом видео Основные функции как и в ее прородителе, настоящей ТС, однако есть и свои фишки, такие как: ОперСтатистика с возможностью вывода Брутто-скорости, и вместо Аритмии я решил подсчитывать Ритмичность, т.е. при наборе слов типа "сейчас" аритмия будет высокой, следовательно, как бы быстро и четко не набрано было это слово, но параметр аритмии будет показывать что все плохо, а вот ритмичность будет учитывать моменты наложения предыдущих букв. Программа еще далека от стадии завершения, но пользоваться ей уже вполне удобно. Загрузка сохраненных клавограмм происходит пока только в консольной версии, и описывать это сейчас я не стану, т.к. этот функционал пока в стадии разработки. Требуются добровольцы с ОС linux и Mac для тестирования. Прошу спрашивать исходники через личку! Выкладываю код оперативной статистики, все по минимуму, но очень удобно ) Чтобы это заработало, нужно создать два файла, один будет называться key_logger.py, второй speed key_logger.py нужно поместить в папку /usr/local/bin чтобы он смог работать как модуль а speed будет являться запускаемым файлом и его нужно разместить в каталог /usr/bin возможно потребуется доустановить через synaptic модуль python xlib поскольку html не воспринимает табуляцию, то данный код немного деформировался, даю ссылки на данные скрипты ниже key_logger.pyspeedярлыкскрипт /usr/local/bin/key_logger.py скрытый текст… #!/usr/bin/python
import sys, os import time
from Xlib import X, XK, display from Xlib.ext import record from Xlib.protocol import rq
TIM = 1
timer = time.time() t = time.time()
n, n2, by, sy, count, ctr, sy_ctr, by_ctr, ctr_end = 0,0,0,0,0,0,0,0,0
def inc(n): global count global timer count += 1 timer = time.time() return n + count
count_ctr = 0
def ctr(n2): global count_ctr count_ctr += 1 return n2 + count_ctr
def record_callback(reply): data = reply.data key = None while len(data): event, data = rq.EventField(None).parse_binary_value(data, record_dpy.display, None, None) if event.type in [X.KeyPress, X.KeyRelease]: key = key_normal_mode(event) if not key: return def timer_upd(): if (time.time()-timer) >= TIM: print timer global by, sy, n, count, t, count_ctr, by_ctr, sy_ctr, ctr_end, n2 t, by, sy, n, count, count_ctr, by_ctr, sy_ctr, ctr_end, n2= time.time(), 1, 0, 1, 1, 0, 0, 1, 0, 0 else: return
def key_normal_mode(event): f1 = open(os.path.abspath(".speed.log"), "a+") key = '' mod = '' keysym = record_dpy.keycode_to_keysym(event.detail, 0) timer_upd() if event.detail: f1.write("%s %s %s Key %s n" % (round((inc(n)/2-(by+sy)-ctr_end)/(time.time()-t)*60, 2), round((count/2-sy)/(time.time()-t)*60, 2), ((count+1)/2-(by+sy)-ctr_end), event.type == X.KeyPress and ctr(n2) or event.detail ) ) else: print ('%d' % event.detail)
if event.detail == 22 and event.type == X.KeyPress : global by, t0, by_ctr t0 = time.time() by += 2 by_ctr +=2 elif event.detail == 50 and event.type == X.KeyPress or event.detail == 62 and event.type == X.KeyPress : global sy, sy_ctr sy += 1 sy_ctr += 1
elif event.detail == 65 or event.detail == 11 or event.detail == 20 or event.detail == 61 and event.type == X.KeyPress : global count_ctr, sy_ctr, by_ctr, ctr_end sy_ctr = 1 count_ctr = 0 by_ctr = 0
elif event.detail == 37 and event.type == X.KeyPress : global ctr_end, sy_ctr, by_ctr ctr_end += (ctr(n2)-sy_ctr-by_ctr)-1
elif event.detail == 37 and event.type == X.KeyRelease : global count_ctr, sy_ctr, by_ctr, ctr_end sy_ctr = 1 count_ctr = 0 by_ctr = 0
return
record_dpy = display.Display(':0') dpy = display.Display(':0') ctx = dpy.record_create_context( 0, [record.AllClients], [{ 'core_requests': (0, 0), 'core_replies': (0, 0), 'ext_requests': (0, 0, 0, 0), 'ext_replies': (0, 0, 0, 0), 'delivered_events': (0, 0), 'device_events': (X.KeyPress, X.KeyRelease), 'errors': (0, 0), 'client_started': False, 'client_died': False, }]) dpy.record_enable_context(ctx, record_callback)
os._exit(0) скрипт /usr/bin/speedскрытый текст… #!/usr/bin/env python # -*- coding:utf-8 -*- import os, sys import pygtk pygtk.require('2.0') import gtk, gobject import subprocess
MAX_SPEED = 450 MIN_SPEED = 250 COL = 0 filename = open(os.path.abspath(".speed.log"), "w") filename.write("0.0 0.0 0 n") filename.close() p = subprocess.Popen( ['key_logger.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
def countycol():
global perycol2 global csumm, dsumm
intyper = new_val * 5 percol = int(intyper) * 2 perycol, perycol2 = (float(new_val) - (float(percol)/10)), float(percol)/10 colorit = ((float(perycol) * 1280)) c1 = ("0" + hex(int(256-colorit))[2:4]) [-2] c2 = ("0" + hex(int(256-colorit))[2:4]) [-1] csumm = "%s" % (c1 + c2) d1 = ("0" + hex(int(colorit))[2:4]) [-2] d2 = ("0" + hex(int(colorit))[2:4]) [-1] dsumm = "%s" % (d1 + d2) return
def progress_timeout(pbobj):
if pbobj.activity_check.get_active(): pbobj.pbar.pulse()
else:
global new_val global array
filename = open(os.path.abspath(".speed.log"), "r") for i in filename: array = i.split()
speed = float(array[COL]) spedy = float(speed) new_val = (float(spedy)-MIN_SPEED)/(MAX_SPEED-MIN_SPEED)
if new_val > 1.0: new_val = 1.0 elif new_val < 0.1: new_val = 0.0
countycol()
if perycol2 == 1.0: colsy = ('#FF0000') elif perycol2 == 0.8: colsy = ('#FF' + "%s" + '00') % (csumm) elif perycol2 == 0.6: colsy = ('#' + "%s" + 'FF' + '00') % (dsumm) elif perycol2 == 0.4: colsy = ('#00' + 'FF' + "%s") % (csumm) elif perycol2 == 0.2: colsy = ('#00' + "%s" + 'FF') % (dsumm) elif new_val > 0.01: colsy = ('#' + "%s" + '00' + 'FF') % (csumm) else: colsy = ('#ae00FF')
color = gtk.gdk.color_parse(colsy) pbobj.pbar.set_fraction(new_val) pbobj.window.modify_bg(gtk.STATE_NORMAL, color)
return True class ProgressBar():
def toggle_show_text(self, widget, data=None): if widget.get_active(): global array global speed_real global COL COL = 0 filename = open(os.path.abspath(".speed.log"), "r") for i in filename: array = i.split()
speed_real = "%s%s%s" % (float(array[0]), "/", (array[2])) self.pbar.set_text(str(speed_real)) gobject.timeout_add(66, self.toggle_show_text, widget) else: self.pbar.set_text("")
def toggle_2_show_text(self, widget, data=None): if widget.get_active(): global array global speed_real global COL COL = 1 filename = open(os.path.abspath(".speed.log"), "r") for i in filename: array = i.split()
speed_real = "%s%s%s" % (float(array[1]), "/", (array[2])) self.pbar.set_text(str(speed_real)) gobject.timeout_add(77, self.toggle_2_show_text, widget) else: self.pbar.set_text("")
def toggle_activity_mode(self, widget, data=None): if widget.get_active(): self.pbar.pulse() else: self.pbar.set_fraction(0.0)
def destroy_progress(self, widget, data=None): gobject.source_remove(self.timer) self.timer = 0 p.kill() os.remove(os.path.abspath(".speed.log")) gtk.main_quit() def __init__(self): self.window = gtk.Window(gtk.WINDOW_POPUP) self.window.set_gravity(gtk.gdk.GRAVITY_CENTER) self.window.set_decorated(True) self.window.set_resizable(True) self.window.set_size_request(150, 175) self.window.connect("destroy", self.destroy_progress) self.window.set_title("ОперСтат") self.window.set_border_width(0) self.window.set_decorated(True)
vbox = gtk.VBox(False, 5) vbox.set_border_width(22) self.window.add(vbox) vbox.show()
align = gtk.Alignment(0.5, 0.5, 0, 0) vbox.pack_start(align, False, False, 5) align.show()
self.pbar = gtk.ProgressBar() align.add(self.pbar) self.pbar.show() self.timer = gobject.timeout_add(166, progress_timeout, self)
separator = gtk.HSeparator() vbox.pack_start(separator, False, False, 0) separator.show()
table = gtk.Table(2, 2, False) vbox.pack_start(table, False, True, 0) table.show()
check = gtk.CheckButton("Нетто") table.attach(check, 0, 1, 0, 1, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 5, 5) check.connect("clicked", self.toggle_show_text) check.show()
check = gtk.CheckButton("Брутто") table.attach(check, 0, 1, 1, 2, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 5, 5) check.connect("clicked", self.toggle_2_show_text) check.show() self.activity_check = check = gtk.CheckButton()
button = gtk.Button("Закрыть") button.connect("clicked", self.destroy_progress) vbox.pack_start(button, False, False, 0)
button.show() self.window.show()
def main(): gtk.main() return 0 if __name__ == "__main__": ProgressBar() main() далее нужно установить галочки у обоих скриптов на исполнение. нижний и верхний порог скорости для отображения цвета задается в параметрах MIN и MAX находящихся в начале скрипта speed, а таймаут задается в скрипте key_logger.py в переменной TIM. Еще можно создать ярлык для запуска программы создав текстовый файл с таким содержимым: скрытый текст… [Desktop Entry] Encoding=UTF-8 Name=TSM Comment=Test your speed typing Version=0.1 Exec=speed Terminal=false Icon=preferences-desktop-keyboard-shortcuts Type=Application Categories=GNOME;Utility и переименовать его в TSM.desktop, после чего переместить в /usr/share/applications и оттуда перетащить на рабочий стол. После всех этих манипуляций Опер.Статистика будет работать как на видео из первого поста. Опер статистика учитывает нажатия Ctrl+BS по всем правилам. Возможно определять как реальную так и скорость "Брутто" которая исключает время затраченное на исправления. Еще небольшая особенность Данной программы: таймер заезда начинает отсчет не с момента нажатия шифта, а с момента нажатия первой строчной буквы, т.е. при появлении текста при неактивной строке набора (таймаут 3 сек), шифты зажимать можно заранее. Если есть вопросы по поводу установки или кода, с удовольствием отвечу! На windows тоже запускаются python скрипты, если кто умеет это делать, прошу написать тут, ибо у меня нет опыта и возможности тестирования программы в python-интерпретаторе на windows, и ваша помощь будет полезна. Последний раз отредактировано 22 декабря 2014 в 03:11 пользователем Reset82
|
дядя_Паша
|
Сообщение #2
13 декабря 2014 в 18:37
|
Супермен
2 |
Потестил бы, но сижу на ХР. Reset82 писал(а): ритмичность будет учитывать моменты наложения предыдущих букв Это как? Можно расписать вариант вычисления, а то обычно Р=1-А и наоборот, А=1-Р. Последний раз отредактировано 13 декабря 2014 в 18:40 пользователем дядя_Паша
|
Reset82
|
Сообщение #3
13 декабря 2014 в 18:57
|
Маньяк
42 |
дядя_Паша писал(а): Это как? Можно расписать вариант вычисления, а то обычно Р=1-А и наоборот, А=1-Р. суммируется среднее пересечение и среднее удержание, далее вычисляется разница в процентах со средней паузой (ну это так если в простом варианте) а так формула b1= ср. пересечение b2= ср. удержание b3= ср. пауза (b3*2)-(b1+b2)/2 далее переводится все в проценты и разница вычитается из 100%
|
MMMAAANNN
|
Сообщение #4
13 декабря 2014 в 19:10
|
Супермен
36 |
Какой тип брутто (брутто, брутто+, брутто*) считатется и по какой формуле? Как учитываются комбинации типа Ctrl+Backspace?
|
Reset82
|
Сообщение #5
13 декабря 2014 в 19:25
|
Маньяк
42 |
MMMAAANNN писал(а): Какой тип брутто (брутто, брутто+, брутто*) считатется и по какой формуле? Как учитываются комбинации типа Ctrl+Backspace? брутто* Ctrl+BS считается среднее исправление 4 символа
|
ТОМА-АТОМНАЯ
|
Сообщение #6
13 декабря 2014 в 19:34
|
Организатор событий
116 |
а для лопухов подоконных она работает, или у нас надежда одна на стандартную тайпингстатистик?
|
Reset82
|
Сообщение #7
13 декабря 2014 в 19:38
|
Маньяк
42 |
используется Xlib по этому на windows не попрет скорее всего, я специально же для Линуксов делал, чтобы хоть что-то было.
|
ТОМА-АТОМНАЯ
|
Сообщение #8
13 декабря 2014 в 20:05
|
Организатор событий
116 |
|
WildLion
|
Сообщение #9
13 декабря 2014 в 20:23
|
Новичок
55 |
Последний раз отредактировано 6 января 2015 в 23:05 пользователем WildLion
|
ТОМА-АТОМНАЯ
|
Сообщение #10
13 декабря 2014 в 20:35
|
Организатор событий
116 |
да написать бы чтобы было удобно вставлять в профиля, например какие то разделители вместо скрытого текста. Пока он (скрытый текст) даже на маркдауне не сделан для профилей, хотелось бы как-то все разделить и длинные тексты, относящиеся к чему-то одному, чтобы были в одном месте свернуты и подписаны.
|
Reset82
|
Сообщение #11
13 декабря 2014 в 20:40
|
Маньяк
42 |
LinguaLeo писал(а): Над интерфейсом ещё работать надо. Естественно :) не все сразу, постепенно это будет все дорабатываться и добавляться. Главное основной функционал готов же. ТОМА-АТОМНАЯ писал(а): да написать бы чтобы было удобно вставлять в профиля, например какие то разделители вместо скрытого текста. Пока он (скрытый текст) даже на маркдауне не сделан для профилей, хотелось бы как-то все разделить и длинные тексты, относящиеся к чему-то одному, чтобы были в одном месте свернуты и подписаны. Тома, что за скрытый текст?
|
Lexanni
|
Сообщение #12
13 декабря 2014 в 21:30
|
Маньяк
26 |
Ну круто! :) А на сколько программа адаптирована под разные раскладки? :) Если, например, у меня буквы на Left Shift и Таb, оно их увидит, нарисует нажатие?
|
Reset82
|
Сообщение #13
13 декабря 2014 в 21:44
|
Маньяк
42 |
Lexanni писал(а): Ну круто! :) А на сколько программа адаптирована под разные раскладки? :) Если, например, у меня буквы на Left Shift и Таb, оно их увидит, нарисует нажатие? нужно просто будет прописать эти буквы для этих клавиш самостоятельно, это несложно :) Последний раз отредактировано 13 декабря 2014 в 21:53 пользователем Reset82
|
ТОМА-АТОМНАЯ
|
Сообщение #14
13 декабря 2014 в 22:53
|
Организатор событий
116 |
я интерфейс поняла, как о профилях речь, а это видимо имелось ввиду клавограммы для линуксов и прочих заменителей виндоусов. Поэтому с профилями влезла не в тему скрытый текст… Кода то в профилях была возможность скрытого текста, как на форуме.
|
Reset82
|
Сообщение #15
19 декабря 2014 в 17:26
|
Маньяк
42 |
Выкладываю код оперативной статистики, все по минимуму, но очень удобно ) Чтобы это заработало, нужно создать два файла, один будет называться key_logger.py, второй speed key_logger.py нужно поместить в папку /usr/local/bin чтобы он смог работать как модуль а speed будет являться запускаемым файлом и его нужно разместить в каталог /usr/binпоскольку html не воспринимает табуляцию, то данный код немного деформировался, даю ссылки на данные скрипты ниже key_logger.pyspeedярлыкскрипт /usr/local/bin/key_logger.py скрытый текст… #!/usr/bin/python
import sys, os import time
from Xlib import X, XK, display from Xlib.ext import record from Xlib.protocol import rq
TIM = 1
timer = time.time() t = time.time()
n, n2, by, sy, count, ctr, sy_ctr, by_ctr, ctr_end = 0,0,0,0,0,0,0,0,0
def inc(n): global count global timer count += 1 timer = time.time() return n + count
count_ctr = 0
def ctr(n2): global count_ctr count_ctr += 1 return n2 + count_ctr
def record_callback(reply): data = reply.data key = None while len(data): event, data = rq.EventField(None).parse_binary_value(data, record_dpy.display, None, None) if event.type in [X.KeyPress, X.KeyRelease]: key = key_normal_mode(event) if not key: return def timer_upd(): if (time.time()-timer) >= TIM: print timer global by, sy, n, count, t, count_ctr, by_ctr, sy_ctr, ctr_end, n2 t, by, sy, n, count, count_ctr, by_ctr, sy_ctr, ctr_end, n2= time.time(), 1, 0, 1, 1, 0, 0, 1, 0, 0 else: return
def key_normal_mode(event): f1 = open(os.path.abspath(".speed.log"), "a+") key = '' mod = '' keysym = record_dpy.keycode_to_keysym(event.detail, 0) timer_upd() if event.detail: f1.write("%s %s %s Key %s n" % (round((inc(n)/2-(by+sy)-ctr_end)/(time.time()-t)*60, 2), round((count/2-sy)/(time.time()-t)*60, 2), ((count+1)/2-(by+sy)-ctr_end), event.type == X.KeyPress and ctr(n2) or event.detail ) ) else: print ('%d' % event.detail)
if event.detail == 22 and event.type == X.KeyPress : global by, t0, by_ctr t0 = time.time() by += 2 by_ctr +=2 elif event.detail == 50 and event.type == X.KeyPress or event.detail == 62 and event.type == X.KeyPress : global sy, sy_ctr sy += 1 sy_ctr += 1
elif event.detail == 65 or event.detail == 11 or event.detail == 20 or event.detail == 61 and event.type == X.KeyPress : global count_ctr, sy_ctr, by_ctr, ctr_end sy_ctr = 1 count_ctr = 0 by_ctr = 0
elif event.detail == 37 and event.type == X.KeyPress : global ctr_end, sy_ctr, by_ctr ctr_end += (ctr(n2)-sy_ctr-by_ctr)-1
elif event.detail == 37 and event.type == X.KeyRelease : global count_ctr, sy_ctr, by_ctr, ctr_end sy_ctr = 1 count_ctr = 0 by_ctr = 0
return
record_dpy = display.Display(':0') dpy = display.Display(':0') ctx = dpy.record_create_context( 0, [record.AllClients], [{ 'core_requests': (0, 0), 'core_replies': (0, 0), 'ext_requests': (0, 0, 0, 0), 'ext_replies': (0, 0, 0, 0), 'delivered_events': (0, 0), 'device_events': (X.KeyPress, X.KeyRelease), 'errors': (0, 0), 'client_started': False, 'client_died': False, }]) dpy.record_enable_context(ctx, record_callback)
os._exit(0) скрипт /usr/bin/speedскрытый текст… #!/usr/bin/env python # -*- coding:utf-8 -*- import os, sys import pygtk pygtk.require('2.0') import gtk, gobject import subprocess
MAX_SPEED = 450 MIN_SPEED = 250 COL = 0 filename = open(os.path.abspath(".speed.log"), "w") filename.write("0.0 0.0 0 n") filename.close() p = subprocess.Popen( ['key_logger.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
def countycol():
global perycol2 global csumm, dsumm
intyper = new_val * 5 percol = int(intyper) * 2 perycol, perycol2 = (float(new_val) - (float(percol)/10)), float(percol)/10 colorit = ((float(perycol) * 1280)) c1 = ("0" + hex(int(256-colorit))[2:4]) [-2] c2 = ("0" + hex(int(256-colorit))[2:4]) [-1] csumm = "%s" % (c1 + c2) d1 = ("0" + hex(int(colorit))[2:4]) [-2] d2 = ("0" + hex(int(colorit))[2:4]) [-1] dsumm = "%s" % (d1 + d2) return
def progress_timeout(pbobj):
if pbobj.activity_check.get_active(): pbobj.pbar.pulse()
else:
global new_val global array
filename = open(os.path.abspath(".speed.log"), "r") for i in filename: array = i.split()
speed = float(array[COL]) spedy = float(speed) new_val = (float(spedy)-MIN_SPEED)/(MAX_SPEED-MIN_SPEED)
if new_val > 1.0: new_val = 1.0 elif new_val < 0.1: new_val = 0.0
countycol()
if perycol2 == 1.0: colsy = ('#FF0000') elif perycol2 == 0.8: colsy = ('#FF' + "%s" + '00') % (csumm) elif perycol2 == 0.6: colsy = ('#' + "%s" + 'FF' + '00') % (dsumm) elif perycol2 == 0.4: colsy = ('#00' + 'FF' + "%s") % (csumm) elif perycol2 == 0.2: colsy = ('#00' + "%s" + 'FF') % (dsumm) elif new_val > 0.01: colsy = ('#' + "%s" + '00' + 'FF') % (csumm) else: colsy = ('#ae00FF')
color = gtk.gdk.color_parse(colsy) pbobj.pbar.set_fraction(new_val) pbobj.window.modify_bg(gtk.STATE_NORMAL, color)
return True class ProgressBar():
def toggle_show_text(self, widget, data=None): if widget.get_active(): global array global speed_real global COL COL = 0 filename = open(os.path.abspath(".speed.log"), "r") for i in filename: array = i.split()
speed_real = "%s%s%s" % (float(array[0]), "/", (array[2])) self.pbar.set_text(str(speed_real)) gobject.timeout_add(66, self.toggle_show_text, widget) else: self.pbar.set_text("")
def toggle_2_show_text(self, widget, data=None): if widget.get_active(): global array global speed_real global COL COL = 1 filename = open(os.path.abspath(".speed.log"), "r") for i in filename: array = i.split()
speed_real = "%s%s%s" % (float(array[1]), "/", (array[2])) self.pbar.set_text(str(speed_real)) gobject.timeout_add(77, self.toggle_2_show_text, widget) else: self.pbar.set_text("")
def toggle_activity_mode(self, widget, data=None): if widget.get_active(): self.pbar.pulse() else: self.pbar.set_fraction(0.0)
def destroy_progress(self, widget, data=None): gobject.source_remove(self.timer) self.timer = 0 p.kill() os.remove(os.path.abspath(".speed.log")) gtk.main_quit() def __init__(self): self.window = gtk.Window(gtk.WINDOW_POPUP) self.window.set_gravity(gtk.gdk.GRAVITY_CENTER) self.window.set_decorated(True) self.window.set_resizable(True) self.window.set_size_request(150, 175) self.window.connect("destroy", self.destroy_progress) self.window.set_title("ОперСтат") self.window.set_border_width(0) self.window.set_decorated(True)
vbox = gtk.VBox(False, 5) vbox.set_border_width(22) self.window.add(vbox) vbox.show()
align = gtk.Alignment(0.5, 0.5, 0, 0) vbox.pack_start(align, False, False, 5) align.show()
self.pbar = gtk.ProgressBar() align.add(self.pbar) self.pbar.show() self.timer = gobject.timeout_add(166, progress_timeout, self)
separator = gtk.HSeparator() vbox.pack_start(separator, False, False, 0) separator.show()
table = gtk.Table(2, 2, False) vbox.pack_start(table, False, True, 0) table.show()
check = gtk.CheckButton("Нетто") table.attach(check, 0, 1, 0, 1, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 5, 5) check.connect("clicked", self.toggle_show_text) check.show()
check = gtk.CheckButton("Брутто") table.attach(check, 0, 1, 1, 2, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 5, 5) check.connect("clicked", self.toggle_2_show_text) check.show() self.activity_check = check = gtk.CheckButton()
button = gtk.Button("Закрыть") button.connect("clicked", self.destroy_progress) vbox.pack_start(button, False, False, 0)
button.show() self.window.show()
def main(): gtk.main() return 0 if __name__ == "__main__": ProgressBar() main() далее нужно установить галочки у обоих скриптов на исполнение. нижний и верхний порог скорости для отображения цвета задается в параметрах MIN и MAX находящихся в начале скрипта speed, а таймаут задается в скрипте key_logger.py в переменной TIM. Еще можно создать ярлык для запуска программы создав текстовый файл с таким содержимым: скрытый текст… [Desktop Entry] Encoding=UTF-8 Name=TSM Comment=Test your speed typing Version=0.1 Exec=speed Terminal=false Icon=preferences-desktop-keyboard-shortcuts Type=Application Categories=GNOME;Utility и переименовать его в TSM.desktop, после чего переместить в /usr/share/applications и оттуда перетащить на рабочий стол. После всех этих манипуляций Опер.Статистика будет работать как на видео из первого поста. Опер статистика учитывает нажатия Ctrl+BS по всем правилам. Возможно определять как реальную так и скорость "Брутто" которая исключает время затраченное на исправления. Еще небольшая особенность Данной программы: таймер заезда начинает отсчет не с момента нажатия шифта, а с момента нажатия первой строчной буквы, т.е. при появлении текста при неактивной строке набора (таймаут 3 сек), шифты зажимать можно заранее. Если есть вопросы по поводу установки или кода, с удовольствием отвечу! На windows тоже запускаются python скрипты, если кто умеет это делать, прошу написать тут, ибо у меня нет опыта и возможности тестирования программы в python-интерпретаторе на windows, и ваша помощь будет полезна. Последний раз отредактировано 19 декабря 2014 в 18:51 пользователем Reset82
|
lins
|
Сообщение #16
19 декабря 2014 в 19:14
|
Новичок
1 |
Ну, выложил правильно, конечно... Я сходу глянул, там сверху в двух функциях инденты пожраны были, какое нафиг... Попробовал под Debian 7, попросили у меня модуль python-xlib, поставил, вроде заработала... Ну, показывает она чего-то, может кому и нужна эта "мгновенная" или какая там скорость. По мне так, просто по глазам бьёт, вот и весь полезный функционал! :) В отличие от вариации smalloc, которая работает и даже иногда используется, как видим: Ну, да если не останавливаешься, то и флаг в руки, ежели чего интересного будет, дык оно и неплохо совсем...
|
Reset82
|
Сообщение #17
19 декабря 2014 в 19:41
|
Маньяк
42 |
в двух функциях инденты пожраны были я же написал что код деформировался из-за невосприятия табов html
|
Reset82
|
Сообщение #18
19 декабря 2014 в 19:49
|
Маньяк
42 |
lins писал(а): В отличие от вариации smalloc, которая работает и даже иногда используется, как видим: не понял какой смысл скрыт в том что ты выложил скрин с ТС под винду и сказал о варианте smalloc, ну да ладно...
|
lins
|
Сообщение #19
19 декабря 2014 в 20:33
|
Новичок
1 |
Ну, почему же "ладно"? :) "Смысл" в том, что собственно клавограмма сделана ИМЕННО программой smalloc. А вот открыта Typing Statistics! Я её мог и не открывать, просто взять и дать на неё ссылку. Жаждущие посмотрят, если захотят. То есть, теперь "у меня Linux" в плане неподтверждения результата за отмазку не хиляет. "Не хочу" - ради бога, принимается, а вот просто "у меня Linux" уже не катит. Существует программа, которая позволяет результат подтвердить ТС-кой. И она называется xtsf. Пользовать вполне можно.
|
Reset82
|
Сообщение #20
19 декабря 2014 в 20:41
|
Маньяк
42 |
Речь то об удобном контроле своей печати, анализе. Опять же, брутто в опер.статистике очень удобно на марафонах. А клавограммы и в TypingScreen тоже открываются и записываются. Но конечно же, изначально ТС не позиционировалась как средство доказывающее кому-либо что-либо, но я так понял, что сейчас это в приоретете.
П.С. У меня Linux, и я не собираюсь использовать xtsf чтобы доказывать что-то!
|