2013-04-09 175 views
0

我知道有一點點要求讓一羣人瀏覽幾個代碼塊,但我會盡力去嘗試。我正在用tk創建python的克隆(第二次世界大戰中使用的德國加密機器)。邏輯上查看我的代碼,方法encrypt()要麼返回字符串「警報」,這是極不可能的,或者它返回None。有人請給它一個快速,但敬業的目光,這樣我可以解決這個問題嗎?謝謝。爲什麼encrypt()返回None?

from Tkinter import * 
from string import letters 
import tkMessageBox 

root = Tk() 
root.title("EnigmaTK") 

def rank(x, d = dict((letr,n%26+1) for n,letr in enumerate(letters[0:52]))): 
    return d[x] 


def shift(key, array): 
    counter = range(len(array)) 
    new = counter 
    for i in counter: 
     new[i] = array[i-key] 
    return new 

alph = ["a", "b", "c", "d", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", " "] 
rotI = ["a", "b", "c", "d", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", " "] 
rotII = ["a", "b", "c", "d", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", " "] 
rotIII = ["a", "b", "c", "d", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", " "] 
ref = ["a", "b", "c", "d", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "e", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", " "] 

label = Label(root, text="Input:") 
label.pack(side = LEFT) 
entry = Entry(root) 
entry.pack(side = RIGHT) 
input = entry.get() 
rotor_set = map(rank, input[:3]) 
message = input[3:] 


def encrypt(): 
    new_message = message 
    for a in xrange(len(message)): 
     for e in range(rotor_set[2]): 
      new_message[a] = alph[rotI.index(rotII[rotIII.index(ref[rotIII.index(rotII[rotI.index(alph[a])])])])] 
      a = a + 1 
      rotIII = shift(1, rotIII) 
     for i in range(rotor_set[1]): 
      new_message[a] = alph[rotI.index(rotII[rotIII.index(ref[rotIII.index(rotII[rotI.index(alph[a])])])])] 
      a = a + 1 
      rotII = shift(1, rotII) 
     for o in range(rotor_set[0]): 
      new_message[a] = alph[rotI.index(rotII[rotIII.index(ref[rotIII.index(rotII[rotI.index(alph[a])])])])] 
      a = a + 1 
      rotI = shift(1, rotI) 
    return new_message 


def show(): 
    tkMessageBox.showinfo("English to Enigma", encrypt()) 


e = Button(root, text = "encrypt", command = show) 
e.pack() 
root.mainloop() 

靠近頂部的字母都是一樣的。如果問題解決了,我會改變這一點。謝謝。

回答

0

我的猜測是encrypt正在拋出一個由Tk翻譯成警報的異常。如果從命令行啓動程序,您可能會看到異常。

如果這是一個例外,我的猜測是你試圖修改new_messagenew_message[a] = ...。如果new_message是一個字符串(或元組),這在Python中是不允許的,因爲字符串是不可變的。相反,使用列表:

new_message = list(message) 

,並加入消息,當您返回:

return ''.join(new_message) 
0

此行似乎在錯誤的時間來執行:

input = entry.get() 

我想你想在用戶單擊按鈕時獲取數據,而不是在程序運行開始時獲取數據。由於當使用單擊按鈕時您不獲取數據,因此message保留爲空字符串,new_message變爲空字符串,並且encrypt()返回空字符串。

一種可能的解決方案是修改encrypt()

def encrypt(): 
    input = entry.get() 
    new_message = input[3:] 
    ... 
相關問題