#!/usr/bin/env python from Tkinter import * def lettermath(key, ptxt, fun): lha, rha = key.lower(), ptxt.lower() if not (lha in 'abcdefghijklmnopqrstuvwxyz'): return ptxt if not (rha in 'abcdefghijklmnopqrstuvwxyz'): return ptxt va = ord('a') lhv, rhv = ord(lha)-va, ord(rha)-va return chr(fun(lhv, rhv) + va) def stringmath(key, ptxt, fun): maxlen = max(len(key), len(ptxt)) left, right = '', '' while len(left) < len(ptxt): left = left + key while len(right) < len(key): right = right + ptxt left, right = left[:maxlen], right[:maxlen] return ''.join([lettermath(left[x], right[x], fun) for x in range(maxlen)])[:-1] def demo(): kk, vv = raw_input("Key? "), raw_input("String? ") add = lambda x, y: (x + y) % 26 print stringmath(kk, vv, add) def doupdate(keybox, textbox, ff): lhs = keybox.get() if lhs == '': return rhs = textbox.get('1.0', END) if rhs == '': return newphrase = stringmath(lhs, rhs, ff) textbox.delete('1.0', END) textbox.insert('1.0', newphrase) def main(): #global keybox, textbox f = Frame() f.master.title("Vigenere") keylabel = Label(f, text="Key:") txtlabel = Label(f, text="Text:") keybox = Entry(f, width=40, text='') txtbox = Text(f, width=60, height=10) addtext = lambda x, y: (x + y) % 26 subtext = lambda x, y: (y - x) % 26 # Remember, it's key, then plaintext. addcall = lambda: doupdate(keybox, txtbox, addtext) subcall = lambda: doupdate(keybox, txtbox, subtext) addbutton = Button(f, text=">>", command=addcall) subbutton = Button(f, text="<<", command=subcall) keylabel.grid_configure(row=0, column=0) keybox.grid_configure(row=0, column=1) subbutton.grid_configure(row=0, column=2) addbutton.grid_configure(row=0, column=3) txtlabel.grid_configure(row=1, column=0) txtbox.grid_configure(row=1, column=1, columnspan=3) f.grid() f.mainloop() if __name__ == '__main__': main()