具有动态变量的ElementTree解析在Spyder中有效,但在PyCharm中不起作用

时间:2019-06-13 23:18:26

标签: python pycharm spyder elementtree

我最近从Spyder切换到PyCharm,而我的代码中用动态变量解析ElementTree的部分在PyCharm中不起作用。

在我的GUI中,从现有XML文件中读取不同研究协议的默认设备设置。该代码将XML文件作为ElementTree导入,并对其进行迭代以使用研究名称填充QComboBox。这部分仍然可以正常工作(所有研究名称都出现在我的组合框中),因此我知道ElementTree已正确导入并且正在读取XML文件。

import xml.etree.ElementTree as ET

def combofill(self):
    """Re-read xml file and re-populate drop-down menu"""
    self.tree = ET.parse('studydefaults.xml')
    self.root = self.tree.getroot()
    self.studyCombo.clear()
    self.studyCombo.addItem("None")
    for study in self.root.findall('study'):
        self.studyCombo.addItem(study.get('name'))

但是,当用户从ComboBox中选择一个检查时,应从ElementTree中读取与该检查相关的参数以填充GUI中的其他QLineEdits。这使用动态变量名称搜索当前选定研究的子代。这部分在Spyder中可以正常工作,但是使用PyCharm时,不会填充QLineEdits,并且出现错误:

def read_defaults(self):
    """Read and import default settings from XML file(s) to LineEdits."""
    if self.studyCombo.currentIndex() >= 1:           #item 1 = 'none'
        name = self.studyCombo.currentText()      #get name of current study

        #access parameters using elementtree xpaths to xml tags
        self.xrate_box.setText(self.root.find(".//*[@name='"+ name +"']/xrate").text)
        self.xduration_box.setText(self.root.find(".//*[@name='"+ name +"']/xduration").text)
        #etc for 7 other parameters/comboboxes
Traceback (most recent call last):
  File "B:/Wilson/WinPython-64bit-2.7.10.3/sarah_development/V2-MasterClock/dwf_MainWindow.py", line 671, in read_defaults
    self.qrate_box.setText(str(self.root.findall(".//*[@name='"+ name +"']/qrate")))
  File "B:\Wilson\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\xml\etree\ElementTree.py", line 390, in findall
    return ElementPath.findall(self, path, namespaces)
  File "B:\Wilson\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\xml\etree\ElementPath.py", line 293, in findall
    return list(iterfind(elem, path, namespaces))
  File "B:\Wilson\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\xml\etree\ElementPath.py", line 263, in iterfind
    selector.append(ops[token[0]](next, token))
KeyError: PyQt4.QtCore.QString(u'.')

我很直觉这是类型错误,因此我尝试了各种方法将这些元素转换为setText命令中的字符串,包括:

self.xrate_box.setText(self.root.find(str(".//*[@name='"+ name +"']/xrate")))

self.xrate_box.setText(str(self.root.find(".//*[@name='"+ name +"']/xrate")))

这些给了我与“ .text”方法相同的错误。

不幸的是,由于其他一些问题和管理决定,我需要坚持使用PyCharm,而不能仅仅恢复到Spyder。关于如何克服这一问题的任何建议将不胜感激!

0 个答案:

没有答案