2016-04-10 6 views
0

PyQt4ウィジェットを作成するクラスとxmlを解析して入力を取得するクラスがあります。私は起きていないXML(s)は渡された、からの読み込み、ウィジェットにボタンを追加dyanamically UIを作成したい:PyQt4、どのように現在のウィジェットを作成するには?

import sys 

import xml.etree.ElementTree as ET 
from PyQt4 import QtGui 

ui = None 

class userInterface(QtGui.QWidget): 
    def __init__(self): 
    super(userInterface, self).__init__() 

    def getFilesWindow(self): 
     self.filesSelected = [] 
     fDialog = QtGui.QFileDialog.getOpenFileNames(self, 'Open file', '/Learning/Python/substance_XML_reading/', "SBS (*.sbs)") 

     for path in fDialog: 
      if path:self.filesSelected.append(path) 
     return self.filesSelected 

class ParseXML(): 

    def getXMLTags(self,fileList): 
     self.tags = [] 
     if fileList: 
      print fileList 

     for eachFile in fileList: 
      fileToParse = ET.parse(eachFile) 
      root = fileToParse.getroot() 
      for child in root: 
       self.tags.append(child.tag) 
     return self.tags 

def getSetUI(flist): 
    global ui 
    if flist: 
     tagsForBtns = ParseXML().getXMLTags(flist) 
     print tagsForBtns 
     for eachitem in tagsForBtns: 
      btn = QtGui.QPushButton(ui,eachitem) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ui = userInterface() 
    fileListForUIGen = ui.getFilesWindow() # will return a list of files 

    getSetUI(fileListForUIGen) # Parses each file, gets tags, creates buttons and has to add to the current window..NOT WORKING 

    ui.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

答えて

0

をウィジェットにボタンを追加するためには、あなたが内側にそれらを配置する必要がありますQLayout

class Widget(QtGui.QWidget): 
    def __init__(self): 
     super(Widget, self).__init__() 
     self.ui_lay = QtGui.QVBoxLayout() 
     self.setLayout(self.ui_lay) 

    def addButton(self, text): 
     btn = QtGui.QPushButton(text, self) 
     self.ui_lay.addWidget(btn) 

... 

for eachitem in tagsForBtns: 
    ui.addButton(eachitem) 

また、あなたはそれをこのようにやっているつもりなら、あなたのmain()機能でglobal uiを使用してください。

個人的には、すべての関数呼び出しを分割する理由は個人的にはわかりません。私はそれらをすべてUserInterfaceクラスに入れるだけです。