0

我正在运行一些 python 代码并得到一个错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "multiline14.py", line 28, in getText
    if encodinghex in process:
TypeError: argument of type 'function' is not iterable

我的定义如下。

def gui(item):
    def default_encode(s):
        pass

    # map items from menu to commands
    encodinghex = '.encode("hex")'
    decodinghex = '.decode("hex")'
    mapping = {"encode_b64": base64.encodestring,"encode_url": urllib.quote_plus,"encode_hex": encodinghex, "decode_b64": base64.decodestring, "decode_url": urllib.unquote_plus, "decode_hex": decodinghex}


    process = mapping.get(item, default_encode)

    def getText():
    #clear bottom text field
        bottomtext.delete(1.0, END)
    #var equals whats in middle
        var = middletext.get(1.0, 'end-1c')

    #insert encoded var in bottom
        if encodinghex in process:
            var = '"%s"' % (var)
            bottomtext.insert(INSERT, eval(var + process))
        elif decodinghex in process:
            var = '"%s"' % (var)
            bottomtext.insert(INSERT, eval(var + process))
        else:
            bottomtext.insert(INSERT, process(var))

是什么导致了这个错误?

4

3 回答 3

1

你所做的似乎根本没有任何意义。您有两个文本字符串,encodinghex 和 decoderhex,您可以将eval它们转换为要执行的代码。但是在您的mappingdict 中,您还拥有各种实际方法,您也试图将其传递给eval这些方法 - 这本身肯定会失败,但甚至在此之前,您的代码正试图将现有的文本字符串添加到实际的函数值,这是不可能的。

于 2012-07-24T10:38:28.103 回答
1

您正在从这里请求一个函数:mapping

process = mapping.get(item, default_encode)

然后,您尝试在此处对其进行迭代:

if encodinghex in process:

除非主题是 ,否则您不能使用in关键字Iterable

您在这里尝试实现的是实际查看您的调用返回了哪个函数mapping.get()

if process == encodinghex:

Note that base64.encodestring, urllib.quote_plus, encodinghex, base64.decodestring, urllib.unquote_plus, decodinghex are all functions

于 2012-07-24T11:05:11.647 回答
0

从示例的最后一行来看,您在process()某处调用了一个函数。然而,您尝试访问它,就好像它是 line 中的一个可迭代对象if encodinghex in process。要修复错误,请更改函数或可迭代的名称。

于 2012-07-24T10:35:58.167 回答