从Python和Tkinter中的变量构建命令

时间:2012-07-20 09:35:31

标签: python tkinter

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

我有一个Tkinter菜单,它将变量提供给GUI def,项目指定为base64urllib或编码十六进制。

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

在运行时,此时,底部框架中出现以下内容(作为示例) - blackcat显然是输入到中间框架的内容。

base64.encodestring('blackcat
')

有两个问题:

  1. 使代码实际格式正确,即不超过2行,如上所示

  2. 让代码运行,而不是将命令本身打印在底部。

  3. 我正在使用的代码如下所示:

    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)
    

1 个答案:

答案 0 :(得分:1)

文本小部件保证尾随换行符,因此在获取文本小部件的内容时应使用"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)