You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Tkinter凯撒密码GUI程序报错:'tra'未定义,求排查修复

凯撒密码GUI程序错误排查与修复

核心错误点

  1. 类方法缩进错误:createwidgets、getTranslatedMessage、encrypt这些方法未缩进在Application类内部,导致它们不属于类成员方法,无法访问self对象,也无法被正确调用。
  2. 变量作用域与函数调用问题:tra是getTranslatedMessage内部的局部变量,encrypt方法直接引用会报未定义;且getTranslatedMessage从未被调用,加密逻辑完全没执行。
  3. 数据类型错误:从Entry控件获取的key是字符串类型,直接用于数值计算会报错,需转换为整数。
  4. 冗余方法:things方法无实际作用,可直接删除。

修复后的完整代码

from tkinter import *

class Application(Frame):
    def __init__(self, master):
        super(Application, self).__init__(master)
        self.grid()
        self.createwidgets()

    def createwidgets(self):
        Label(self,
              text="Encrypt a message:",
              ).grid(row=0, column=0, columnspan=2, sticky=W)

        Label(self,
              text="What's your message?:",
              ).grid(row=1, column=0, sticky=W)
        self.messageent = Entry(self)
        self.messageent.grid(row=2, column=0, sticky=W)  # 修正row跳变,保持布局连续

        Label(self,
              text="What's the key?:(1 - 25)",
              ).grid(row=3, column=0, sticky=W)
        self.keyent = Entry(self)
        self.keyent.grid(row=4, column=0, sticky=W)
        
        Button(self,
               text="Click for coded message",
               command=self.encrypt
               ).grid(row=5, column=0, sticky=W)

        self.messagetxt = Text(self, width=75, height=10, wrap=WORD)
        self.messagetxt.grid(row=6, column=0, columnspan=4)

    def getTranslatedMessage(self, message, key):
        tra = ''
        for symbol in message:
            if symbol.isalpha():
                num = ord(symbol)
                num += key

                if symbol.isupper():
                    if num > ord('Z'):
                        num -= 26
                    elif num < ord('A'):
                        num += 26
                elif symbol.islower():
                    if num > ord('z'):
                        num -= 26
                    elif num < ord('a'):
                        num += 26

                tra += chr(num)
            else:
                tra += symbol
        return tra  # 返回加密后的字符串

    def encrypt(self):
        try:
            message = self.messageent.get()
            key = int(self.keyent.get())  # 将字符串密钥转为整数
            # 调用加密函数获取结果
            encryptedmessage = self.getTranslatedMessage(message, key)
            self.messagetxt.delete(0.0, END)
            self.messagetxt.insert(0.0, encryptedmessage)
        except ValueError:
            # 处理输入非数字密钥的异常情况
            self.messagetxt.delete(0.0, END)
            self.messagetxt.insert(0.0, "请输入有效的数字密钥(1-25)!")

root = Tk()
root.title("Encrypting message")
app = Application(root)
root.mainloop()

额外优化说明

  • 修正控件布局的row序号,避免不必要的空白行,让界面更紧凑。
  • 添加异常处理,当用户输入非数字密钥时显示错误提示,提升程序健壮性。
  • 修正英文拼写错误(Whats → What's)。

内容的提问来源于stack exchange,提问作者user20032123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:31:17