【问题标题】:Strange error when trying to use base64 with Tkinter Text尝试将 base64 与 Tkinter Text 一起使用时出现奇怪的错误
【发布时间】:2014-12-07 00:23:29
【问题描述】:

我目前正在制作一个简单的工具,可以使用此处找到的一些代码来加密/解密文本:https://stackoverflow.com/a/16321853/4285156

当我在 CMD 中运行它时,它运行得非常好。当我尝试将代码与 Tkinter Text() 小部件一起使用时出现问题。

这是我的程序截图:http://i.imgur.com/8sTkAUN.png

如您所见,它对文本“Hello, world”进行了加密。正好。问题是每当我尝试解密某些东西时,控制台都会给我一条错误消息,并且它不起作用。

我认为这与我使用 Text() 小部件这一事实有关,但为什么它在我加密内容时有效,但在尝试解密内容时无效?正如我之前所说,当我不使用 Tkinter 时,两种方式都可以正常工作。

代码如下:

from Tkinter import *
import base64

password = "aS4KmfkKr5662LfLKjrI6Kan4fK"

def encode(key, clear):
    enc = []
    for i in range(len(clear)):
        key_c = key[i % len(key)]
        enc_c = chr((ord(clear[i]) + ord(key_c)) % 256)
        enc.append(enc_c)
    return base64.urlsafe_b64encode("".join(enc))

def decode(key, enc):
    dec = []
    enc = base64.urlsafe_b64decode(enc)
    for i in range(len(enc)):
        key_c = key[i % len(key)]
        dec_c = chr((256 + ord(enc[i]) - ord(key_c)) % 256)
        dec.append(dec_c)
    return "".join(dec)


GUI = Tk()
GUI.title('Cryppy')
GUI.minsize(width=300, height=300)

txt1 = Label(GUI, text="Decrypted Text")
txt1.grid(row=0, column=0, sticky=W, padx=(10,10))

tBox1 = Text(GUI, bd=2, width=60, height=5)
tBox1.grid(row=1, column=0, sticky=W, padx=(10,10))

txt2 = Label(GUI, text="Encrypted Text:")
txt2.grid(row=2, column=0, sticky=W, padx=(10,10))

tBox2 = Text(GUI, bd=2, width=60, height=5)
tBox2.grid(row=3, column=0, sticky=W, padx=(10,10))

def cryptIt():
    codeIt = encode(password, tBox1.get("1.0", "end-1c"))
    print codeIt
    tBox2.delete("1.0", END)
    tBox2.insert(END, codeIt)

def decryptIt():
    decodeIt = decode(password, tBox2.get("1.0", "end-1c"))
    print decodeIt
    tBox1.delete("1.0", END)
    tBox1.insert(END, decodeIt)

bCrypt = Button(GUI, text="Encrypt", command=cryptIt)
bCrypt.grid(row=4, sticky=W, padx=(10,10))

bCrypt2 = Button(GUI, text="Decrypt", command=decryptIt)
bCrypt2.grid(row=4, sticky=W, padx=(65,10))

GUI.mainloop()

这是错误信息

Exception in Tkinter callback
Traceback (most recent call last):
  File "E:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__
    return self.func(*args)
  File "C:\Users\Runar\Google Drive\Prosjekter\SyncNote\Source Code\mainEx.py", line 47, in decryptIt
    decodeIt = decode(password, tBox2.get("1.0", "end-1c"))
  File "C:\Users\Runar\Google Drive\Prosjekter\SyncNote\Source Code\mainEx.py", line 16, in decode
    enc = base64.urlsafe_b64decode(enc)
  File "E:\Python27\lib\base64.py", line 112, in urlsafe_b64decode
    return b64decode(s, '-_')
  File "E:\Python27\lib\base64.py", line 71, in b64decode
    s = _translate(s, {altchars[0]: '+', altchars[1]: '/'})
  File "E:\Python27\lib\base64.py", line 36, in _translate
    return s.translate(''.join(translation))
TypeError: character mapping must return integer, None or unicode

【问题讨论】:

  • 您是否尝试在此站点中搜索该错误代码?被问过好几次了。我不确定哪一个是这个的副本,也许是所有的。做一点研究,然后告诉我们你学到了什么。

标签: python encryption tkinter base64


【解决方案1】:

我认为 urlsafe_b64decode 不适用于 unicode。只需将输入字符串设为 ascii,例如

  enc = base64.urlsafe_b64decode(enc.encode('ascii','ignore'))

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 2023-03-07
    • 2020-12-27
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多