2014-09-23 96 views
1

所以我试图创建一个简单的GUI,它需要一个yaml文件并通过PyQT进行编辑。 假设yaml包含{example:“Helloworld”}如何使用PyQt4 GUI编辑yaml文件

即使在GUI框中显示yaml,我也遇到了麻烦。

所以我用Python编写的GUI文本框:

import yaml 
import sys 
from PyQt4 import QtGui, QtCore 

class GUI(QtGui.QWidget): 

    def __init__(self): 
     super(GUI, self).__init__() 
     self.initUI() 

    def initUI(self):  

     msg = QtGui.Qlabel("This is a test message") 
     self.msg.move(60, 20) 

     self.addedLine = QtGui.QLabel(self) 
     textBox = QtGui.QLineEdit(self) 

     textBox.move(60, 100) 
     self.addedLine.move(60, 40) 

     textBox.textChanged[str].connect(self.onChanged) 

     self.setGeometry(500, 500, 500, 500) 
     self.setWindowTitle('QtGui.QLineEdit') 
     self.show() 

    def onChanged(self, text): 

     self.addedLine.setText(text) 
     self.addedLine.adjustSize()   

def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = GUI() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

而这仅仅是用于显示YAML数据

def displayYaml(): 
    yamlDoc = open("yaml.yml",'r') 
    data = yaml.load(yamlDoc) 
    yamlDoc.close() 
    prettyData = yaml.dump(data, default_flow_style=False) 
    return prettyData 

所以我可以这样displayYaml功能添加到一个简单的函数GUI类?或者我必须将它作为一个单独的文件并导入它?我尝试没有功能的displayYaml代码,并试图直接写入入initUI但是,这并不工作,我得到的错误:

UnboundLocalError: local variable 'yaml' referenced before assignment 

最后,我希望它 1显示了YAML文档。这将是一条固定的消息行。 2.有一个单独的消息行和文本更改框,我已经做了 3.使用textchange框中的任何输入覆盖yaml文档。

+0

您可以将'displayYaml'到类。你可以把它作为一个独立的函数在一个事件上调用(单击按钮等),或者你可以让initUI运行它。 – 101 2014-09-23 21:48:29

+0

这也不是很有效,所以老实说,我是一个,但没有想法。 – KirinSoo 2014-09-23 22:09:36

回答

2
import sys, yaml 
from PyQt4 import QtGui, QtCore 

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 
     self.verticalLayout = QtGui.QVBoxLayout() 
     self.plainTextEdit = QtGui.QPlainTextEdit() 
     self.verticalLayout.addWidget(self.plainTextEdit) 
     self.pushButton = QtGui.QPushButton("Load Yaml") 
     self.verticalLayout.addWidget(self.pushButton) 
     self.setLayout(self.verticalLayout) 
     self.pushButton.clicked.connect(self.loadYaml) 

    def loadYaml(self): 
     fileName = str(QtGui.QFileDialog.getOpenFileName(self, "Open File","/home/some/folder","Yaml(*.yaml);;AllFiles(*.*)")) 
     f = open(fileName) 
     getData = yaml.safe_load(f) 
     prettyData = yaml.dump(getData, default_flow_style=False) 
     self.plainTextEdit.appendPlainText(str(prettyData)) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    ex.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

试试这个代码

+0

谢谢!因此,这解决了加载数据问题...但我可以做两个按钮:“加载yaml”和“保存yaml”和任何在PlainTextEdit窗口中覆盖当前的yaml? – KirinSoo 2014-09-23 22:39:25

+2

它完全取决于你:) – Achayan 2014-09-23 22:43:55