Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 从类Ui\u MainWindow(对象)的方法访问变量_Oop_Pyqt5_Qt5_Qtablewidget_Qtablewidgetitem - Fatal编程技术网

Oop 从类Ui\u MainWindow(对象)的方法访问变量

Oop 从类Ui\u MainWindow(对象)的方法访问变量,oop,pyqt5,qt5,qtablewidget,qtablewidgetitem,Oop,Pyqt5,Qt5,Qtablewidget,Qtablewidgetitem,我已经创建了一个GUI,它要求对文件进行索引,在其中进行搜索并输出结果。 我被最后一点卡住了,那就是显示检索到的文档摘录 我需要用嵌入在同一类中的搜索引擎的结果填充tableWidget。我以为变量可以从类中的任何地方访问,但我错了 这是我迄今为止尝试过的最新代码: class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow&qu

我已经创建了一个GUI,它要求对文件进行索引,在其中进行搜索并输出结果。 我被最后一点卡住了,那就是显示检索到的文档摘录

我需要用嵌入在同一类中的搜索引擎的结果填充tableWidget。我以为变量可以从类中的任何地方访问,但我错了

这是我迄今为止尝试过的最新代码:

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1126, 879)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(40, 30, 100, 30))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(180, 30, 120, 30))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(620, 30, 80, 30))
        self.pushButton_3.setObjectName("pushButton_3")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(380, 60, 191, 21))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(40, 90, 50, 21))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(380, 30, 50, 35))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label2 = QtWidgets.QLabel(self.centralwidget)
        self.label2.setGeometry(QtCore.QRect(40, 70, 150, 16))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.label2.setFont(font)
        self.label2.setObjectName("label")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(0, 120, 1121, 721))
        self.tableWidget.setObjectName("tableWidget")
        data = self.data()
        numrows = len(data)
        numcols = len(data[0])
        self.tableWidget.setColumnCount(numcols)
        self.tableWidget.setRowCount(numrows)
        for row in range(numrows):
            for column in range(numcols):
               self.tableWidget.setItem(row, column, QTableWidgetItem((data[row][column])))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1126, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
与结果相关的功能如下所示:

def search(self):
        os.chdir(self.folder_path)
        self.ix = open_dir("indexdir")
        MYDIR = ("Results")
        CHECK_FOLDER = os.path.isdir(MYDIR)
        if not CHECK_FOLDER:
            os.makedirs(MYDIR) 
        self.text = self.lineEdit.text()
        self.query_str = self.text
        self.query = qparser.QueryParser("textdata", schema = self.ix.schema)
        self.q = self.query.parse(self.query_str)
        self.topN = self.lineEdit_2.text()
        if self.lineEdit_2.text() == "":
            self.topN = 1000           
        else:
            self.topN = int(self.lineEdit_2.text())
        
        self.data=[]
        with self.ix.searcher() as searcher:
            self.results = searcher.search(self.q, terms=True, limit=self.topN)
            Upper = highlight.UppercaseFormatter()
            self.results.formatter = Upper
            my_cf = highlight.ContextFragmenter(maxchars=500, surround=300)
            self.results.fragmenter = my_cf
            for self.i in self.results:
                   self.data.append({"title": self.i['title'], "text": self.i.highlights('textdata')})
        return self.data
我得到了这个
错误:AttributeError:'Ui\u MainWindow'对象没有属性'folder\u path'


如何访问self.data来填充表?

您似乎试图使用“folder\u path”属性,而没有先创建它。 在使用“您的搜索”功能之前,请将此行添加到类中:

self.folder_path=add/your/path/


我还将注意到,在您提供的代码中,搜索函数似乎是在类之外定义的(这可能只是自动格式化对堆栈溢出的影响)。为了使您的self.folder\u path变量可以按名称使用,请仔细检查是否已将其正确缩进以使其成为类方法。

我通过清理SetupUI并创建一个在编辑行中单击后运行的函数来克服此问题

self.lineEdit.returnPressed.connect(self.datatable)
    
    def datatable(self): 
              
        data = self.data
        numrows = len(self.data)
        numcols = len(self.data[0])
        self.tableWidget.setColumnCount(numcols)
        self.tableWidget.setRowCount(numrows)
        self.tableWidget.setHorizontalHeaderLabels((list(self.data[0].keys())))
        self.tableWidget.resizeColumnsToContents()
        self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
        self.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
        for row in range(numrows):
            for column in range(numcols):
                item = (list(self.data[row].values())[column])
                self.tableWidget.setItem(row, column, QTableWidgetItem(item))

您的代码是不完整的(为了将来的参考,您应该始终提供一个),但是从外观上看,我将在这里阻止您:您不应该编辑
pyuic
的输出(也不应该尝试模仿它创建的类)。阅读更多有关如何正确使用这些文件的信息。我没有发布所有代码,因为其中有许多与此查询无关的代码。到目前为止,我已经修改了pyuic的内容,并且效果良好。我只需要知道如何从安装ui访问结果搜索功能,或者是否必须创建另一个功能,然后从那里访问它。我以前阅读过文档并搜索过解决方案。但是我不知道怎么做。如前所述,如果没有MRE,很难找到问题的根源,但是有可能您正在创建一个
Ui\u MainWindow
实例,并对一个QMainWindow实例使用
setupUi
,这可能是错误的根源。我知道编辑pyuic文件“似乎”是可行的,但这不是建议的方法;其中一个原因是,它可能会在类和它们实际执行的操作之间造成混淆。我强烈建议您创建一个新脚本,使用上面链接中解释的uic类,并从中实现代码。不要编辑pyuic生成的文件。这里的问题是函数设置UI指向函数搜索的第一行,而不是返回值。搜索函数在同一类中。我认为这个问题也可能是我向函数返回值的方式。但我需要将结果附加到字典中,然后才能将其作为可用的数据集返回显示。