简体   繁体   English

从 class Ui_MainWindow(object) 的方法访问变量

[英]Access variable from method of class Ui_MainWindow(object)

I have created a GUI that ask for files to index, search within it and spit out the results.我创建了一个 GUI,它要求对文件进行索引、在其中搜索并输出结果。 I am stuck with the last bit that is to show the excerpt of the documents retrieved.我坚持最后一点,即显示检索到的文档的摘录。

I need to populate the tableWidget with the results of a search engine embedded in the same class.我需要使用嵌入在同一 class 中的搜索引擎的结果填充 tableWidget。 I Thought that the variables were reachable from everywhere within the class is labeled with self, but I was wrong.我以为 class 中的任何地方都可以访问变量,但我错了。

This is my latest code I have tried tried so far:这是我迄今为止尝试过的最新代码:

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)

The function related to the results is as follow:与结果相关的function如下:

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

I got this error: AttributeError: 'Ui_MainWindow' object has no attribute 'folder_path' .我收到此error: AttributeError: 'Ui_MainWindow' object has no attribute 'folder_path'

How I can access the self.data to populate the table?我如何访问 self.data 来填充表格?

It appears that you're trying to use the "folder_path" attribute without having created it first.看来您正在尝试使用“folder_path”属性而没有先创建它。 Before you use the your search function, add this line to your class:在使用搜索 function 之前,将此行添加到 class 中:

self.folder_path = add/your/path/ self.folder_path = 添加/你的/路径/

I'll also note that in the code you provided, it appears that the search function is defined outside of the class (this may just be the effect of auto-formatting on stack overflow).我还要注意,在您提供的代码中,搜索 function 似乎是在 class 之外定义的(这可能只是自动格式化对堆栈溢出的影响)。 In order for to make your self.folder_path variable usable as-named, double check that you've properly indented it as to make it a class method.为了使您的 self.folder_path 变量可以按名称使用,请仔细检查您是否已正确缩进它以使其成为 class 方法。

I overcame the issue by cleaning up SetupUI and creating a function that runs once I click within the editline.我通过清理 SetupUI 并创建一个 function 克服了这个问题,一旦我在编辑行中单击它就会运行。

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))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM