调用某些def时,Findall调用不起作用

时间:2017-09-12 14:37:42

标签: python

所以,这是我关于这个主题的3.帖子,对不起,但我变得越来越聪明了:

所以,完整的代码: 我有一个xml文档,如下所示:

<list>
    <a>
        <item name="Apple" kcal="36" />
        <item name="Apricot" kcal="78" />
    </a>
    <b>
        <item name="Banana" kcal="53" />
        <item name="Bnoodles" kcal="87" />
    </b>
</list>

我的python代码如下所示:

from tkinter import *
import xml.etree.ElementTree as ET

tree = ET.parse("Alphabet.xml")
root = tree.getroot()

font1 = "Arial, 24"
counterRow = 1
counterColumn = 0


def test():
    print("PRINTOUT")
    for items in root.findall("a/item"):
        print(items.get("name"))


def setup():

    for letters in root:
        global counterRow
        global counterColumn
        letters.tag = Button(vindue, text=letters.tag, font=font1, command=test)\
            .grid(row=counterRow, column=counterColumn, sticky="nsew")
        counterColumn += 1
        if counterColumn > 7:
            counterRow += 1
            counterColumn = 0


vindue = Tk()
# setup()
button1 = Button(vindue, text="test", command=setup).grid(row=5)
button2 = Button(vindue, text="test", command=test).grid(row=6)
vindue.mainloop()

正确如此场景如下: 当我运行脚本并且我先按下button2时,我得到这样的打印:

PRINTOUT
Apple
Apricot

如果我按下Button1并获得“A”和“B”按钮,然后按下其中任何一个,我只能得到:

PRINTOUT

如果我按下Button1并获得“A”和“B”按钮 - 但是然后按下Button2然后我得到:

PRINTOUT

我不明白出了什么问题?

编辑:解决方案: 所以你不能直接使用letters.tag,但是如果你把它分配给某种类型的持有者,那就可以了。

def setup():

    for letters in root:
        global counterRow
        global counterColumn
        str = letters.tag
        str = Button(vindue, text=letters.tag, font=font1, command=test)\
            .grid(row=counterRow, column=counterColumn, sticky="nsew")
        counterColumn += 1
        if counterColumn > 7:
            counterRow += 1
            counterColumn = 0

1 个答案:

答案 0 :(得分:0)

问题是在循环中你改变了每个顶级元素的标记。您似乎正在指定Tk Button作为标记,但实际上对标记的任何更改都会显示相似的结果。

>>> import xml.etree.ElementTree as ET
>>> tree = ET.parse("Alphabet.xml")
>>> root = tree.getroot()
>>> list(root.findall("a/item"))
[<Element 'item' at 0x7fbbd755e1d0>, <Element 'item' at 0x7fbbd755e290>]
>>> for letters in root:
...   print letters
...
<Element 'a' at 0x7fbbd755e190>
<Element 'b' at 0x7fbbd755e350>
>>> for letters in root:
...   letters.tag = 'foo'
...
>>> for letters in root:
...   print letters
...
<Element 'foo' at 0x7fbbd755e190>
<Element 'foo' at 0x7fbbd755e350>
>>> list(root.findall("a/item"))
[]
>>>

我不知道您希望分配给tag中每个XML元素的root,但这就是您运行后没有a个标签的原因setup()