从Python和Tkinter中的变量生成命令

从Python和Tkinter中的变量生成命令,python,tkinter,Python,Tkinter,一部分是为了学习,一部分是为了帮助自己,我正在尝试编写一个带有编码/解码GUI的应用程序。目前,我正在进行编码 我有一个Tkinter菜单,它向GUI def提供一个变量,其中的项指定为base64、urllib或encoding hex GUI上存在一个按钮,该按钮运行gettext。我很难让encodedvar包含进程+变量并在底部框架中显示结果 在运行此命令时,下面的内容(作为示例)出现在底部框架中-blackcat显然是进入中间框架的内容 base64.encodestring('bla

一部分是为了学习,一部分是为了帮助自己,我正在尝试编写一个带有编码/解码GUI的应用程序。目前,我正在进行编码

我有一个Tkinter菜单,它向GUI def提供一个变量,其中的项指定为
base64
urllib
或encoding hex

GUI上存在一个按钮,该按钮运行
gettext
。我很难让
encodedvar
包含进程+变量并在底部框架中显示结果

在运行此命令时,下面的内容(作为示例)出现在底部框架中-blackcat显然是进入中间框架的内容

base64.encodestring('blackcat
')
有两个问题:

  • 使代码真正正确格式化,即如上所示不超过2行

  • 让代码运行,而不是命令本身打印在底部

  • 我使用的代码如下所示:

    def gui(item):
        if item == 'encode_b64':
            process = 'base64.encodestring'
        elif item == 'encode_url':
            process = 'urllib.quote_plus'
        else:
            process = '.encode("hex")'
    
    
        def getText():
            bottomtext.delete(1.0, END)
            var = middletext.get(1.0, END)
    
            encodedvar = process + "('%s')" % var
            bottomtext.insert(INSERT, encodedvar)
    

    文本小部件保证有一个尾随的换行符,因此在获取文本小部件的内容时应该使用
    “end-1c”
    。这样做可以保证只获得用户输入的文本,而不需要额外的尾随换行符

    其次,要运行函数而不是打印出来,可以将实际函数存储在变量中,然后使用变量调用函数:

    if item == 'encode_b64':
        process = base64.encodestring
    elif item == 'encode_url':
        process = urllib.quote_plus
    else:
        process = default_encode
    
    def default_encode(s):
        s.encode("hex")
    ...
    bottomtext.insert(INSERT, process(var))
    
    上面的内容可以写得更简洁一些,如下所示:

    mapping = {"encode_b64": base64.encodestring,
               "encode_url": urllib.quote_plus}
    process = mapping.get(item, default_encode)