在学习过程中我们不时会看到有一些题目,明明自己的思路正确,却算不出结果,或者有的时候选择硬磕,得到一个奇形怪状的答案。这是一个比较有意思的事情,明明思路清晰却总是抓不到问题的解法,也许我们可以尝试从问题本身出发,找找问题的漏洞。
接下来便是我和我的python作业之间的故事了。

最近在求解一份python作业的主要问题时困惑了很久,题目要求设计一个窗口,利用升级的凯撒密码去解密一段密文,并得出密钥。这里要解释的地方有两个,其一是“升级的凯撒密码”,首先需要理解凯撒密码是什么,这里引用百度百科的解释:

“恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。

可以看到,凯撒密码通过特定的偏移量将字符依次改变,由于每个字符都是偏移相同的量(A->D, B->E),在加密方式上略显简单,而“升级的凯撒密码”升级的地方便在此,它没有一个固定的偏移量,而是先将明码中某几个字符加密,然后去除掉这几个使用过的字符,将剩余的字符依次对应,至此就得到一个凯撒密码的字符引射表,比如说明码是ABCDEF,密码是dabcef,它就是将先将A->d,接着把abcdef这一串字符去除掉d,然后依次对应到BCDEF中去。
第二个需要解释的就是“密钥”,密钥是指字母映射表中对应字符不连续的一段字符串,这里划重点,它是找出题目漏洞的起始点。
通过作业中题目的示例,可以更好地理解上文说的概念:

假设已知密文和密钥,
ciphertext(密文): d ZJ DK NZKBGP!
The key sentence(密钥句子): zhangs
通过凯撒解密推出明文的原理如下:
先构造映射表,大小写分别对应,应该有两个表,但是两个表之间存在可以转化方法,使用只需要推出一个表就能够得到另一个表,而构造表的方法为
在第一行明码字母中按顺序书写26个字母
在第二行密码字母顺序构建规则:先将密钥(zhangs)中的字母写入映射表的第二行,然后在26个字母中除掉密钥的字母,将剩余字母按顺序写入表中
按以上步骤就可以构建出其中一个表,将这个表的明码字母从小写转化为大写,密码字母从大写转化为小写,就可以得到另一个表,即如果a对应Z,则A对应z


再根据以上表格,得出密文 d ZJ DK NZKBGP的明文就是 i am in danger

来到设计环节,首先用wxpython设计出如下的窗口,

顶部放置两行文本框,用来表示符号映射表(软件界面上只需要写第一个映射表,但是编程时候要2个映射表都要同时用到才能解密),下面放置的是明文文本框和密文文本框,在窗口底部是功能按钮(解密,清除密文,加载密文文档),这里可以对设计进行一点点补充,如下(代码已分享在文档的最后)

作业的文档里提供给了一篇密文,要求我们根据这篇密文解题,内容如下

eKUB
tGB 1ST ARY
uSHMF GBQ EKRMJBT RMA DNVBQHMF GBQSBKC THFGTKY ,SGB AHAM’T FBT UO .iBQ ANQL LRTBS WBQB RCQRHA TN FN HM RMA DNLCNQT GBQ .sGB AHAM’T BRT RMYTGHMF TGB WGNKB ARY ,AHAM’T WRSG GBQ CRDB NQ EQUSG GBQ TBBTG .dT MHFGT ,j DNUKA GBRQ GBQ DQYHMF EBMBRTG TGB EKRMJBQ.
tGB 2MA ARY
sGB RTB TNARY, CNQDBA ANWM EY GBQ QNNLLRTBS .iBQ BYBS WBQB QBA j RKWRYS DRKKBA GBQ “fQY EREY” .sGB RKWRYS SPUHQLBA GBQ LNUTG RMA QBTNQTBA :“oN ,j’L MNT.”
tGB 3QA ARY
tNARY, SGB AQBSSBA VBQY SBXY ,WRKJBA HMTN R ERQ RMA AQRMJ R KNT NC RKDNGNK .uSHMF TBLOTHMF LNVBS, SGB SUQVBYBA TGB QNNL .nRMY LBM DRLB UO TN GBQ RMA CKHQTBA WHTG GBQ TBKKHMF GNW EBRUTHCUK SGB WRS .sGB AQRMJ R KNT LNQB .wGBM R LUDG NKABQ LRM .NKA BMNUFG TN GBQ CRTGBQ ,WRKJBA UO RMA SRHA :"nHSS ,KBT LB TRJB YNU GNLB ,"SGB SOKRSGBA GBQ AQHMJ NMTN GHS CRDB .dS TGB NKABQ LRM FNT QBRAY TN SKRO GBQ .nU SGNWBA UO RMA SRVBA eKUB .j JMNW RKK TGHS EBDRUSB j WRS WRTDGHMF CQNL R DNQMBQ HM TGB ERQ.
tGB 4TG ARY
tNARY, SGB FNT UO QBRKKY BRQKY .dCTBQ EUSYHMF RQNUMA RKK LNQMHMF ,SGB KNDJBA GBQSBKC HMSHAB TGB ERTGQNNL .wGBM GBQ QNNLLRTBS NOBMBA TGB ANNQ ,TGBY WBQB RLRZBA :“sN DKBRM.”
tGB 5TG ARY
sGB EBFRM STUAYHMF. sGB GRA ANMB VBQY WBKK HM SDGNNK EBCNQB. iNWBVBQ, WGBM WB FNT TNFBTGBQ, GBQ FQRABS ABTBQHNQRTBA. jT HS FNNA TN CNDUS NM SNLBTGHMF BKSB RS HT WHKK HLOQNVB QBDNVBQY.
tGQBB LNMTGS KRTBQ
sGB EBDRLB OQBSHABMT NC TGB sTUABMT uMHNM. sGB HS EBDNLHMF LNQB RMA LNQB REKB. sGB RKSN EBDNLBS LNQB NOBM. sNNM, SGB WHKK MBBA TN OQBORQB CNQ FQRAURTB SDGNNK.
pMB YBRQ KRTBQ
tGBQB RQB LRMY LBM EBSHAB, LRMY WGN RQB EBTTBQ TGRM LB. sGB MBVBQ TRJBS MNTHDB NC TGBL, EUT SGB FBTS RKNMF WHTG mHMF VBQY WBKK. tGBQB RQB QULNQS RENUT TGBL HM SDGNNK. sGB TQBRTS GHL KHJB RM BKABQ EQNTGBQ, EUT QULNQ DRMMNT EB EKNDJBA.
tGQBB YBRQS KRTBQ
sGB HS FBTTHMF LRQQHBA. tGB FQNNL HS mHMF, SGB HS WQHTHMF WBAAHMF HMVHTRTHNMS. wGHKB SGB HS WQHTHMF, SGB EBMT NVBQ TGB ABSJ RMA TBRQS CBKK ANWM UMDNMTQNKKREKB. j STBOOBA CNQWRQA RMA SRW SGRT NM RKK TGB HMVHTRTHNMS, TGB FQNNL’S MRLB WRS LHMB.
j WRMT TN DQY TNN, EUT FGNST DRMMNT DQY. j AN MNT GRVB RMY TBRQS.
tGQBB YBRQS RFN, WGBM j WRS DRQQYHMF GBQ EHQTGARY DRJB DQNSSHMF R STQBBT, R DRQ DQRSGBA HMTN LB.

题目要求根据密文推理出映射表和明文,难受的是,我在收到密文文档时还不知道密钥的概念、映射表中大写小写字母互相对应,还有所谓的“去掉密钥之后将剩余字母依次填写”和两个字母映射表的转化关系。于是通过文章给出的信息推出了能够切切实实找到对应关系的字符映射表(第一行是密码,第二行是明码)

翻译效果如下


然后转化为中文,发现是一篇关于人鬼恋的故事——《蓝色生死恋》,故事看完有点瘆人



【前方烧脑提示】翻译完之后本以为作业已经完成了,但其实故事才刚开始。在被提醒之后我知道了要求解密钥这东西,而且前文提到过题目给出的信息十分模糊,这个时候能提取到的不完善的信息是
(1)将已经找出对应关系的字母先写好,再将26个字母中剩下的字母依次填入。这里我其实犯了一个错误,就是表格的第一行写的并不是明码,映射表第一行是密码,第二行是明码,和题目的意思正好相反,错误的映射表位置也就造成了后续的错误推理:

根据上面的图片,将第一行的字母排好序,第二行再一一对应,初步推出的两张映射表如下

再根据字母补齐的原则可以得到上面第一张映射表的完整表格

(2)密钥是去除连续字母的字符串
从上面的表中可以看到,第二行的排序是比较混乱的,并没有原题目中那样把密钥句子放在第二行的开头(毕竟明文和密文位置颠倒了),于是用了一个比较奇怪的方法去推测密钥(图片中把密钥称为关键字)

当然,这种做法是错误的,我在翻译密文的时候用了一两个小时,而密钥的推测却花了一个下午,因为出发点就已经错了,导致最后用了一个比较奇怪的方法结束了推理。后来去问了指导老师,她解释密钥一定是在第二行的前几个字符,而且是一个单词,于是第二轮的探索开始了。
还是根据之前给出来的字母对应关系,但是这次将明码放在映射表的上方,密码放在下方,即

由此得到如下的映射表:


将第一个表格补齐可以得到

这个时候仔细观察表格的对应关系,可以看出表格与原题中给出的规律不一致。我们重新回顾一下原题中表格的规律

将一个表的明码字母从小写转化为大写,密码字母从大写转化为小写,就可以得到另一个表,即如果a对应Z,则A对应z


反观已经推出的映射表,a对应的是R,那么A应该对应的是r,可是映射表中A对应的却是d,这违背了题目中给出的推理规律,接着往下看,b对应E,按规律来讲B应该对应e,映射表中B却对应了a,像这样不对称的关系基于涵盖了整个表,两个表之间字符的关系与题目中给出的规律截然不同,存在着许多的偏差,如果说按照题目给出的规律进行推测,先只看第一个映射表,然后按照第一个表推出第二个映射表如下:

然后再根据第一个表和上面的表去翻译文章,结果如下

可以看到翻译出来的文章出现了问题,如第一段的Jer,第二段的K等等,文章的偏差也就证实了题目给出的规律跟实际上两个映射表对应的关系是相违背的。
当再去观察题目给出的规律,可以注意到题目中明确指出:
在第一行明码字母中按顺序书写26个字母,可是现在已经推出来的两个映射表之间不存在题目中那种互化关系,必须要将包括大小写的54个字母全部书写进去。而可以让这条只输入26个字母的规则成立,它就必须存在着某种规律,让两个映射表之间可以进行互化

那么那种规律究竟为何?答案是明码对应密码,密码对应明码。这种做法一开始也只是做一个尝试,却意外地得到了正确的结果

这就非常地阿妹惊了,为什么这样一种和题目给出规律不一样的解密方式可以得到正确的明文呢,原因就是密文中的大写字母并没有全部出现,再来观察之前推出的对应关系

所有的小写明码都推测出了密码,但是大写明码推出其密码的却只有ACHIMNOSTUW这11个字母。将“小写密码对应大写密码”作为第一个映射表(表1),再颠倒大小写的位置(即明码对应密码,密码对应明码),得到另一个表(表2)。表1自不用多说,因为已经推出了所有小写字母对应的大写字母,所以表1的对应关系一定是正确的,重点是,明明只推测了11个大写字母对应的密码,但为什么表2(用表1转化出了所有1的大写字母)也正确呢?其实,它对了,但又没完全对。抛开表1和表2,先看11个大写字母对应小写字母的映射表(表3),如下

然后再将其按照明码对应密码,密码对应明码的规律,推出它对应的另一个表,如下

再将这个表和表1进行比较,结果也同样非常的阿妹惊,这个表中所有出现了的字母对应关系和表1一模一样,如下

也就是说,当使用表1去推出表2的时候,表2的部分字母是正确的,而这部分字母,就包括题目中已经推测出的11个字母,那么表1表2一起使用,文中出现的所有字母都能得到正确对应关系,翻译出来的明文自然也就正确了,但如果将表3补齐,然后按照明码对应密码,密码对应明码的规律退出另一个表,将这个表和表1对比,如下

可以发现,两个表中存在不少不一致的地方,而这些不一致的地方,就是在表2中错误的部分。由此可以得出结论,正因为文章中出现的大写字母只有11个,而表2中这11个字母又是正确的,所以当用表1推测出不完全正确的表2的时候,文章可以正确翻译出来。
接下来再回到密钥这条线
密钥是指字母映射表中对应字符不连续的一段字符串,是只会出现在开头的一个单词,那么用上述错误的规律得到的映射表,能否得到密钥,答案是肯定的,密钥就是RED,至此整道题就解答完毕

综上,当用题目中给出的正确规律去求解时得到的只有错误的翻译和毫无头绪的密钥,而用另一种错误的方式去做题,便能正确翻译文章并得到密钥
你以为到这里就结束了吗,其实并没有。既然已经知道这种错误方式才能解题,那么题目中的规律到底为什么行不通呢?错误的根源到底在哪呢?答案就是作业文档中给出的密文出了问题!!!
既然可以通过密文去推测规律,那么同样也可以用一种规律将明文加密得到密文,而当使用的规律出现问题的时候,就会得到一篇错误的密文
所以用题目给出的规律,对上述翻译出来的明文进行加密,得到的密文应该是

eMUB
tIB 1ST CDY
uSJOH IBA EMDOLBT DOC FPVBAJOH IBASBMG TJHITMY ,SIB CJCO’T HBT UQ .iBA CPAN NDTBS WBAB DGADJC TP HP JO DOC FPNGPAT IBA .sIB CJCO’T BDT DOYTIJOH TIB WIPMB CDY ,CJCO’T WDSI IBA GDFB PA EAUSI IBA TBBTI .dT OJHIT ,j FPUMC IBDA IBA FAYJOH EBOBDTI TIB EMDOLBA.
tIB 2OC CDY
sIB DTB TPCDY, GPAFBC CPWO EY IBA APPNNDTBS .iBA BYBS WBAB ABC j DMWDYS FDMMBC IBA “fAY EDEY” .sIB DMWDYS SRUJANBC IBA NPUTI DOC ABTPATBC :“oP ,j’N OPT.”
tIB 3AC CDY
tPCDY, SIB CABSSBC VBAY SBXY ,WDMLBC JOTP D EDA DOC CADOL D MPT PG DMFPIPM .uSJOH TBNQTJOH NPVBS, SIB SUAVBYBC TIB APPN .nDOY NBO FDNB UQ TP IBA DOC GMJATBC WJTI IBA TBMMJOH IPW EBDUTJGUM SIB WDS .sIB CADOL D MPT NPAB .wIBO D NUFI PMCBA NDO .PMC BOPUHI TP IBA GDTIBA ,WDMLBC UQ DOC SDJC :"nJSS ,MBT NB TDLB YPU IPNB ,"SIB SQMDSIBC IBA CAJOL POTP IJS GDFB .dS TIB PMCBA NDO HPT ABDCY TP SMDQ IBA .nU SIPWBC UQ DOC SDVBC eMUB .j LOPW DMM TIJS EBFDUSB j WDS WDTFIJOH GAPN D FPAOBA JO TIB EDA.
tIB 4TI CDY
tPCDY, SIB HPT UQ ABDMMY BDAMY .dGTBA EUSYJOH DAPUOC DMM NPAOJOH ,SIB MPFLBC IBASBMG JOSJCB TIB EDTIAPPN .wIBO IBA APPNNDTBS PQBOBC TIB CPPA ,TIBY WBAB DNDZBC :“sP FMBDO.”
tIB 5TI CDY
sIB EBHDO STUCYJOH. sIB IDC CPOB VBAY WBMM JO SFIPPM EBGPAB. iPWBVBA, WIBO WB HPT TPHBTIBA, IBA HADCBS CBTBAJPADTBC. jT JS HPPC TP GPFUS PO SPNBTIJOH BMSB DS JT WJMM JNQAPVB ABFPVBAY.
tIABB NPOTIS MDTBA
sIB EBFDNB QABSJCBOT PG TIB sTUCBOT uOJPO. sIB JS EBFPNJOH NPAB DOC NPAB DEMB. sIB DMSP EBFPNBS NPAB PQBO. sPPO, SIB WJMM OBBC TP QABQDAB GPA HADCUDTB SFIPPM.
pOB YBDA MDTBA
tIBAB DAB NDOY NBO EBSJCB, NDOY WIP DAB EBTTBA TIDO NB. sIB OBVBA TDLBS OPTJFB PG TIBN, EUT SIB HBTS DMPOH WJTI mJOH VBAY WBMM. tIBAB DAB AUNPAS DEPUT TIBN JO SFIPPM. sIB TABDTS IJN MJLB DO BMCBA EAPTIBA, EUT AUNPA FDOOPT EB EMPFLBC.
tIABB YBDAS MDTBA
sIB JS HBTTJOH NDAAJBC. tIB HAPPN JS mJOH, SIB JS WAJTJOH WBCCJOH JOVJTDTJPOS. wIJMB SIB JS WAJTJOH, SIB EBOT PVBA TIB CBSL DOC TBDAS GBMM CPWO UOFPOTAPMMDEMB. j STBQQBC GPAWDAC DOC SDW SIDT PO DMM TIB JOVJTDTJPOS, TIB HAPPN’S ODNB WDS NJOB.
j WDOT TP FAY TPP, EUT HIPST FDOOPT FAY. j CP OPT IDVB DOY TBDAS.
tIABB YBDAS DHP, WIBO j WDS FDAAYJOH IBA EJATICDY FDLB FAPSSJOH D STABBT, D FDA FADSIBC JOTP NB.

当我们以一种辩证的眼光,探索的态度去学习内容的时候,也许能发现一些意外的收获,枯燥的学习也能够变得有趣。
非常感谢大家耐心看完 ! 我是incredibleimpact,希望我的分享能对你有所帮助。

# Import the required libraries
import wx
import tkinter.filedialog
from tkinter import Variable
import os
class A(wx.Frame):def __init__(self, superion):wx.Frame.__init__(self, parent=superion, title='decryption software of Caesars upgraded version',pos=(300,50),size=(900,750))self.panel = wx.Panel(self)# Add label controlself.label_L = wx.StaticText(parent=self.panel, label='Letter mapping table : ', pos=(15,20))self.label_P = wx.StaticText(parent=self.panel, label='*Please modify the second line of the mapping table', pos=(550,55))# Show text in redself.label_P.SetForegroundColour((255, 0, 0))self.label_p = wx.StaticText(parent=self.panel, label='plaintext : ', pos=(86, 100))self.label_c = wx.StaticText(parent=self.panel, label='ciphertxt : ', pos=(85, 375))# Modify font colorself.label_L.SetForegroundColour((30, 50, 100))self.label_c.SetForegroundColour((30, 50, 100))self.label_p.SetForegroundColour((30, 50, 100))# Add text controlself.former = wx.TextCtrl(self.panel,pos=(155, 17),size=(385,-1))self.trans = wx.TextCtrl(self.panel,pos=(155, 50), size=(385,-1))self.plaintextBox = wx.TextCtrl(parent=self.panel, pos=(155, 100),size=(500, 250),style=wx.TE_MULTILINE | wx.HSCROLL | wx.TE_DONTWRAP)self.ciphertextBox = wx.TextCtrl(parent=self.panel, pos=(155, 375), size=(500, 250),style=wx.TE_MULTILINE | wx.HSCROLL | wx.TE_DONTWRAP)# Add button controlself.buttonLoad = wx.Button(parent=self.panel, label='load ciphertext file', pos=(680,580),size=(150,-1))self.buttonLoad.SetForegroundColour((30, 50, 100))self.Bind(wx.EVT_BUTTON, self.OnButtonLoad, self.buttonLoad)self.buttonChoose = wx.Button(parent=self.panel, label='Select the file', pos=(680, 540), size=(150, -1))self.buttonChoose.SetForegroundColour((30, 50, 100))self.Bind(wx.EVT_BUTTON, self.OnButtonChoose, self.buttonChoose)self.buttonDecrypt = wx.Button(parent=self.panel, label='Decrypt', pos=(125,660))self.buttonDecrypt.SetForegroundColour((30, 50, 100))self.Bind(wx.EVT_BUTTON, self.OnButtonDecrypt, self.buttonDecrypt)self.buttonClear = wx.Button(parent=self.panel, label='Clear ciphertext', pos=(335,660))self.buttonClear.SetForegroundColour((30, 50, 100))self.Bind(wx.EVT_BUTTON, self.OnButtonClear, self.buttonClear)self.buttonClear_ = wx.Button(parent=self.panel, label='Clear plaintext', pos=(480,660))self.buttonClear_.SetForegroundColour((30, 50, 100))self.Bind(wx.EVT_BUTTON, self.OnButtonClear_, self.buttonClear_)self.buttonQuit = wx.Button(parent=self.panel, label='Quit', pos=(610, 660))self.buttonQuit.SetForegroundColour((30, 50, 100))self.Bind(wx.EVT_BUTTON, self.OnButtonQuit, self.buttonQuit)self.buttonSet=wx.Button(parent=self.panel, label='a key Set', pos=(710, 200),size=(100,40))self.buttonSet.SetForegroundColour((30, 50, 100))self.Bind(wx.EVT_BUTTON, self.OnButtonSet, self.buttonSet)self.buttonEncrypt = wx.Button(parent=self.panel, label='Encrypt', pos=(230, 660))self.buttonEncrypt.SetForegroundColour((30, 50, 100))self.Bind(wx.EVT_BUTTON, self.OnButtonEncrypt, self.buttonEncrypt)def OnButtonChoose(self, event):# A pop-up window prompts that only English text files can be selecteda = wx.MessageDialog(None, "you can only open English text documents!", "tips",wx.YES_DEFAULT | wx.ICON_QUESTION)if a.ShowModal() == wx.ID_YES:a.Destroy()try:  # Error when opening non-English text filedefault_dir = r"文件路径"loading_txt = tkinter.filedialog.askopenfilename(title=u'选择文件',initialdir=(os.path.expanduser((default_dir))))with open(loading_txt,'r')as rfile:lines=rfile.readlines()self.ciphertextBox.SetValue(''.join(lines))except Exception:a = wx.MessageDialog(None, "Open failed!Possibly to open non-English text documents!", "Error!",wx.YES_DEFAULT | wx.ICON_QUESTION)if a.ShowModal() == wx.ID_YES:a.Destroy()def OnButtonLoad(self, event):# Open the file and load the text boxwith open('zxwcipher.txt','r')as file:lines=file.readlines()self.ciphertextBox.SetValue(''.join(lines))def OnButtonDecrypt(self, event):# Decrypt textif len(self.former.GetValue())!=len(self.trans.GetValue()):a = wx.MessageDialog(None, "The data of Letter mapping table is not matched,please check again!", "warning", wx.YES_DEFAULT | wx.ICON_QUESTION)if a.ShowModal() == wx.ID_YES:a.Destroy()returnif (self.ciphertextBox.GetValue() == ""):toastone = wx.MessageDialog(None, "The ciphertext cannot be empty", "warning", wx.YES_DEFAULT | wx.ICON_QUESTION)if toastone.ShowModal() == wx.ID_YES:toastone.Destroy()returnl1=list(self.former.GetValue())l2=list(self.trans.GetValue())d = dict(zip(l1, l2)) # Use a dictionary to match the upper and lower letters one by oned.update(dict(zip(l2, l1)))'''Change the uppercase of the mapping table to uppercase, lowercase the lowercase, and then invert it,use the dictionary to correspond one by one, and add to the existing dictionary ''''''若要用题目中给出规律进行解密,以上四段代码应改为l1=list(self.former.GetValue())l2=list(self.trans.GetValue())l3=str.upper(self.former.GetValue())l4=str.lower(list(self.trans.GetValue()))d = dict(zip(l1, l2))d.update(dict(zip(l3, l4)))'''trans=list(self.ciphertextBox.GetValue())for i, j in enumerate(trans):if j in d.keys():trans[i] = d[j]self.plaintextBox.SetValue(''.join(trans))def OnButtonEncrypt(self,event):# Encrypted text, invert the corresponding relationship between the context and the tableif len(self.former.GetValue())!=len(self.trans.GetValue()):a = wx.MessageDialog(None, "The data of Letter mapping table is not matched,please check again!", "warning", wx.YES_DEFAULT | wx.ICON_QUESTION)if a.ShowModal() == wx.ID_YES:a.Destroy()returnif (self.plaintextBox.GetValue() == ""):toastone = wx.MessageDialog(None, "The plaintext cannot be empty", "warning", wx.YES_DEFAULT | wx.ICON_QUESTION)if toastone.ShowModal() == wx.ID_YES:toastone.Destroy()returnl1=list(self.former.GetValue())l2=list(self.trans.GetValue())d = dict(zip(l2, l1))d.update(dict(zip(l1, l2)))'''若要用题目中给出规律进行加密,以上四段代码应改为l1=list(self.former.GetValue())l2=list(self.trans.GetValue())l3=str.upper(self.former.GetValue())l4=str.lower(list(self.trans.GetValue()))d = dict(zip(l2, l1))d.update(dict(zip(l4, l3)))'''trans=list(self.plaintextBox.GetValue())for i, j in enumerate(trans):if j in d.keys():trans[i] = d[j]self.ciphertextBox.SetValue(''.join(trans))def OnButtonClear_(self, event):self.plaintextBox.SetValue('')def OnButtonClear(self, event):self.ciphertextBox.SetValue('')def OnButtonQuit(self, event):# A prompt window pops up when exitingdlg=wx.MessageDialog(self,'Really Quit?','Caution',wx.CANCEL|wx.OK|wx.ICON_QUESTION)if dlg.ShowModal() == wx.ID_OK:self.Destroy()def OnButtonSet(self,event):self.former.SetValue('a b c d e f g h i j k l m n o p q r s t u v w x y z')self.trans.SetValue('R E D A B C F G H I J K L M N O P Q S T U V W X Y Z')
if __name__ == '__main__':app = wx.App()frame = A(None)frame.Show()app.MainLoop()

一份只有做错的人才能做对的作业相关推荐

  1. 专访微软全球资深副总裁:中国AI正在爆发式崛起,千万不要复制美国,要建立自己的模式,才能做领导者

    记者 | 周翔 编辑 | 鸽子 近日,在微软亚洲研究院与哈工大共同举办的第十九届"二十一世纪的计算"国际学术研讨会上, Peter Lee 博士作为微软全球资深副总裁, 也来到了现 ...

  2. 2020年度总结(只有做好自己不喜欢的事情你才能做自己喜欢的事情)

    2020是一个让人刻苦铭心的年份,每个学生在这一年都度过了有史以来最长的寒假吧. 回顾2020:寒假期间 首先呢,在这里向那些逆行者以及白衣天使致敬,谢谢您们! 寒假的漫长也让我学会了不少,首先呢,花 ...

  3. 开课吧:怎样才能做软件架构师?

    是否是一个好的架构师,先问问自己是否知道什么是好的架构.一个好的软件架构既可以是一个完整的模型,也可以是拆掉重组成另一个完整的模型,即高内聚.低耦合.有时一个看似简单的架构往往却是一件艺术珍品.那么怎 ...

  4. Ubuntu还需要做什么才能替代Windows?

    ugmbbc发布于 2008-10-30 13:24:17|<script src="http://www.cnbeta.com/counter.php?sid=68420" ...

  5. 不想做却不得不做某份工作,怎么破?

    很多人都不喜欢自己的工作,却又不得不靠这份工作的薪水生活,于是就不得不努力把讨厌的事情做下去.长久这样下去,就陷入了一个非常尴尬的境地:一方面牢骚满腹,一方面又无法离开.就这样苦苦挣扎,看不到出路,终 ...

  6. 什么叫水平,不是看懂了叫水平,也不是会用了就叫水平,更不是懂得更多才叫有水平,而是知道如何做才能做得更好才叫真正有水平?...

    其实有很多同事.朋友.同行,水平个个都很强的,写程序也很快,但是他们有一个共同的缺点,就是懂得太多.想法太多.想做得太多但是仔细认真做得太少.做得精的太少.经得起考验的更少.真正可以实际应用可以广泛推 ...

  7. 情感驿站 | 什么叫跟对人,才能做对事?

    什么叫跟对人才能做对事? 答:到菜市场买菜,跟在大妈后面,等大妈砍完价以后,说,我也来两斤 什么叫合作与主动? 答:就是大妈和老板有点僵持的时候,你冲上去说便宜点我也要2斤

  8. 我在网上认识了一位女孩子~我很喜欢她~她对我的感觉很好~跟我聊天~她很开心~我想请较大家来帮帮我~我能和她在一起吗~在现实中没见过面~我要怎么做~怎样才能让她成我女朋友呢?

    我在网上认识了一位女孩子~我很喜欢她~她对我的感觉很好~跟我聊天~她很开心~我想请较大家来帮帮我~我能和她在一起吗~在现实中没见过面~我要怎么做~怎样才能让她成我女朋友呢>?

  9. 人工智能行业要什么学历才能做?要考研吗?

    先说结论,最好是考研.在人工智能行业中,不同的职位和公司对于学历要求也不同,但一般来说,人工智能领域的从业者需要具备一定的数学.计算机科学.统计学等基础知识和技能.以下是一些人工智能相关职位的学历要求 ...

最新文章

  1. NLP命名实体识别(NER)代码实践
  2. 全局变量中断原子操作_中断函数里改变一个全局变量的值,在主函数里却检测到未变化...
  3. 基于linux操作系统Mysql的基本操作(一)
  4. 2016年软考网络工程师考试命题范围变化之网络设备配置与复习技巧
  5. kali下fcrackzip使用
  6. SAP MM 用户不希望采购订单一旦Release就自动打印输出,如何控制?
  7. 关于iframe中session 失效问题
  8. win10无法开启夜间模式
  9. 【软考】2020年全国计算机技术与软件专业技术资格考试,软件设计师,考纲
  10. 耳挂式蓝牙耳机原理_耳挂式蓝牙耳机项目总结分析报告
  11. maven安装教程(Idea)
  12. kali linux安装谷歌拼音输入法(亲测可用)
  13. 很好用的绘图软件cad,非常喜欢这个简易方法
  14. python接入图灵机器人_Python使用微信接入图灵机器人过程解析
  15. 利用OpenCV实现一个简单的实时人脸检测项目并显示FPS
  16. shadow密码字段为!!_您的密码可能不如您想像的安全!
  17. thinkphp3.2.3 支付宝授权登录php
  18. 信鸽推送集成采坑之代码混淆报错/XINGE: [Util] please add wup-1.0.0.E-SNAPSHOT.jar in your libs
  19. 小孔成像总结_干货 | 初中物理解题技巧+方法总结,非常实用,初二初三都要看!...
  20. nltk安装,语料库nltk下载

热门文章

  1. java实现一元线性回归算法
  2. 几个技术虚拟小组会议的思考
  3. android - 【记录】三星手机(N9002)刷机、官方系统、TWRP
  4. cogs 997. [東方S2] 射命丸文
  5. 百度地图JavaScript API开发叠加行政区划图
  6. python-九九乘法表(矩形)
  7. Hadoop-wordcount,合并多个part-*文件
  8. 《阅读的方法》读书笔记2-2:遥远的地方
  9. 阿里内部信:构建“大中台、小前台”组织机制
  10. 123456数字组合排列(5个数组合不能重复)