我最近从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。关于如何克服这一问题的任何建议将不胜感激!