-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Alexander Bernauer
committed
Apr 22, 2009
0 parents
commit 2c612af
Showing
2 changed files
with
280 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
#!/usr/bin/python | ||
|
||
from gui import Gui | ||
from random import Random | ||
from string import join | ||
|
||
class Engine: | ||
alphas = ["a", "a1", "a1A", "a1A!"] | ||
alpha = 0 | ||
training = 0 | ||
ready = 0 | ||
def __init__(self): | ||
self.option = "amount" | ||
self.options = {"amount":(5,0), "uptime":(20,0), "delay":(20,0), "alphas":self.alphas[self.alpha]} | ||
self.gui = Gui(self.key_event_handler) | ||
|
||
apply(self.gui.display_option, (), self.options) | ||
|
||
self.rnd = Random() | ||
|
||
def run(self): | ||
self.gui.run() | ||
|
||
def train(self): | ||
if self.training: | ||
return | ||
self.training = 1 | ||
self.ready = 0 | ||
self.user_input = [] | ||
|
||
self.passw = [] | ||
i = 0 | ||
var = self.options["amount"][1] | ||
len = self.options["amount"][0] + self.rnd.randint(-1*var, var) | ||
if len < 1: | ||
len = 1 | ||
while i < len: | ||
char = self.rnd.randint(33,126) | ||
if self.alpha!=3: | ||
if char in range(33,48) or char in range(58,65) or char in range(91,97) or char in range(123,127): # special characters | ||
continue | ||
if self.alpha!=2: | ||
if char in range(65,91): #A-Z | ||
continue | ||
if self.alpha!=1: | ||
if char in range(48,58): #0-9 | ||
continue | ||
if not self.alpha in range(4): | ||
raise "train: illigal value for alpha: %d" %self.alpha | ||
|
||
self.passw.append(chr(char)) | ||
i += 1 | ||
|
||
self.callback(0,0) | ||
|
||
def callback(self, *args): | ||
if args[1] == 0: | ||
if args[0] < self.passw.__len__(): | ||
self.gui.display_passw(self.passw, args[0], args[0]+1) | ||
upt, var = self.options["uptime"] | ||
total = upt + self.rnd.randint(-1*var, var) | ||
self.gui.tk_callback(total*10, self.callback, args[0], 1) | ||
else: | ||
self.ready = 1 | ||
else: | ||
self.gui.display_passw(self.passw,0,0) | ||
delay, var = self.options["delay"] | ||
total = delay + self.rnd.randint(-1*var, var) | ||
self.gui.tk_callback(total*10, self.callback, args[0]+1, 0) | ||
|
||
def user_completed(self): | ||
mistakes = self.passw.__len__() - self.user_input.__len__() | ||
for i in range(self.user_input.__len__()): | ||
if self.passw.__len__() <= i: | ||
mistakes += 1 | ||
else: | ||
if ord(self.user_input[i])!= ord(self.passw[i]): | ||
mistakes += 1 | ||
|
||
user = join(self.user_input,"") | ||
pw = join(self.passw, "") | ||
show = join((pw, user, str(mistakes))) | ||
self.gui.display_passw(show, 0, show.__len__()) | ||
self.gui.newline() | ||
self.training = 0 | ||
self.ready = 0 | ||
|
||
def key_event_handler(self, event): | ||
k = event.keysym | ||
if k in ("F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "Up", "Down", "Left", "Right"): | ||
self.handle_options(k) | ||
else: | ||
self.handle_user_input(k) | ||
|
||
def handle_options(self, k): | ||
if k == "F2": | ||
self.option = "amount" | ||
elif k == "F3": | ||
self.option = "uptime" | ||
elif k == "F4": | ||
self.option = "delay" | ||
elif k == "F5": | ||
self.option = "alphas" | ||
elif k in ("Up", "Down", "Left", "Right"): | ||
if self.option in ("amount", "uptime", "delay"): | ||
a,b = self.options[self.option] | ||
if (k=="Up"): | ||
a = a + 1 | ||
elif (k=="Down"): | ||
if (a>1): | ||
a = a - 1 | ||
elif (k=="Right"): | ||
b = b + 1 | ||
elif (k=="Left"): | ||
if (b>0): | ||
b = b - 1 | ||
self.options[self.option] = (a,b) | ||
elif self.option == "alphas": | ||
if (k=="Up"): | ||
if self.alpha < self.alphas.__len__() - 1: | ||
self.alpha += 1 | ||
elif (k=="Down"): | ||
if self.alpha > 0: | ||
self.alpha -= 1 | ||
self.options[self.option] = self.alphas[self.alpha] | ||
|
||
apply(self.gui.display_option,(),{self.option:self.options[self.option]}) | ||
else: | ||
pass | ||
|
||
def handle_user_input(self, k): | ||
if k == "Escape": | ||
self.gui.quit() | ||
elif k == "Return": | ||
if self.training == 0: | ||
self.train() | ||
if self.ready == 1: | ||
self.user_completed() | ||
elif k == "BackSpace": | ||
if self.training == 1: | ||
self.user_input=[] | ||
self.callback(0,0) | ||
elif k in ("Shift_R", "Shift_L", "Tab", "Next", "Prior", "Control_L", "Control_R", "CapsLock", "Alt_L", "Alt_R", "Mode_switch", "Menu", "SuperL", "Delete", "Insert", "Print"): | ||
pass | ||
else: | ||
if self.ready: | ||
self.user_input.append(k) | ||
|
||
if __name__ == '__main__': | ||
engine = Engine() | ||
engine.run() | ||
else: | ||
print "Module engine loaded" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
from Tkinter import * | ||
from string import join | ||
|
||
class MyText(Text): | ||
def __init__(self, master, **kw): | ||
apply(Text.__init__,(self,master),kw) | ||
self["bg"] = "#000" | ||
self["fg"] = "#0f0" | ||
self["font"] = ("Helvetica", "13") | ||
self.bind("<Key>", lambda e: "break") | ||
self.bind("<Button-1>", lambda e: "break") | ||
self.bind("<Double-Button-1>", lambda e: "break") | ||
|
||
|
||
class Gui: | ||
def __init__(self, event_handler): | ||
self.root = Tk() | ||
self.root.title("Spy Trainer") | ||
|
||
help_text = MyText(self.root) | ||
help_text.insert(INSERT, """Help: | ||
<ESC> \t \t Exit | ||
<Return> \t \t Start | ||
<Backspace> \t Replay | ||
<F1> \t \t Help | ||
<F2> \t \t Edit Amount | ||
<F3> \t \t Edit Uptime | ||
<F4> \t \t Edit Delay | ||
<F5> \t \t Edit Alphabet | ||
<Up> \t \t Increase Value | ||
<Down> \t \t Decrease Value | ||
<Right> \t \t Increase Scattering | ||
<Left> \t \t Decrease Scattering""") | ||
|
||
self.opt_text = MyText(self.root) | ||
self.opt_text.insert(INSERT, "Options:\n") | ||
self.opt_text.mark_set("amount", INSERT) | ||
self.opt_text.mark_gravity("amount", LEFT) | ||
self.opt_text.insert(INSERT, "\n") | ||
self.opt_text.mark_set("uptime", INSERT) | ||
self.opt_text.mark_gravity("uptime", LEFT) | ||
self.opt_text.insert(INSERT, "\n") | ||
self.opt_text.mark_set("delay", INSERT) | ||
self.opt_text.mark_gravity("delay", LEFT) | ||
self.opt_text.insert(INSERT, "\n") | ||
self.opt_text.mark_set("alphas", INSERT) | ||
self.opt_text.mark_gravity("alphas", LEFT) | ||
self.opt_text.insert(INSERT, "\n") | ||
|
||
|
||
self.main_text = MyText(self.root) | ||
self.main_text.mark_set("curline", INSERT) | ||
self.main_text.mark_gravity("curline", LEFT) | ||
self.main_text.insert(INSERT, "hello world") | ||
|
||
|
||
# slider = Scrollbar(self.root, orient=VERTICAL,command=self.scrtest) | ||
# self.main_text["yscrollcommand"]=slider.set | ||
|
||
help_text.grid(column=2, row=0,sticky=N+E+S+W) | ||
self.opt_text.grid(column=2,row=1, sticky=N+E+S+W) | ||
self.main_text.grid(column=0, row=0, rowspan=2) | ||
# slider.grid(column=1, row=0, rowspan=2, sticky=N+S) | ||
|
||
apply(self.main_text.config,(),{"height":40, "width":80}) | ||
apply(help_text.config,(),{"height":20, "width":40}) | ||
apply(self.opt_text.config,(),{"height":20, "width":40}) | ||
|
||
self.root.bind("<Key>", event_handler) | ||
|
||
|
||
def run(self): | ||
self.root.mainloop() | ||
|
||
def quit(self): | ||
self.root.quit() | ||
|
||
def tk_callback(self, delay, callback, a, b): | ||
self.root.after(delay, callback, a, b) | ||
|
||
def option_string(self, option, options): | ||
if (options[1] == 0) : | ||
return "%s: %d" % (option,options[0]) | ||
else: | ||
return join((option, " %d +/- %d" %options), ":") | ||
|
||
def display_option(self, **options): | ||
for option in options.keys(): | ||
if option in ("amount", "uptime", "delay"): | ||
self.opt_text.delete(option, "%s lineend" %option) | ||
self.opt_text.insert(option, self.option_string(option, options[option])) | ||
elif option == "alphas": | ||
self.opt_text.delete("alphas", "alphas lineend") | ||
self.opt_text.insert("alphas", "Alphabeth: %s" %options[option]) | ||
else: | ||
raise "illigal option %s" %k | ||
|
||
|
||
def display_passw(self, passw, disc, max): | ||
displ = [] | ||
i=0 | ||
for c in passw: | ||
if i == max: | ||
break | ||
if i<disc: | ||
displ.append(" ") | ||
else: | ||
displ.append(c) | ||
i += 1 | ||
|
||
|
||
self.main_text.delete("curline", "curline lineend") | ||
self.main_text.insert("curline", join(displ)) | ||
|
||
def newline(self): | ||
self.main_text.mark_unset("curline") | ||
self.main_text.insert(INSERT, "\n") | ||
self.main_text.mark_set("curline", INSERT) | ||
self.main_text.mark_gravity("curline", LEFT) | ||
self.main_text.see(INSERT) | ||
|
||
|
||
|
||
|
||
|