从类 Ui_MainWindow(object) 的方法访问变量
Posted
技术标签:
【中文标题】从类 Ui_MainWindow(object) 的方法访问变量【英文标题】:Access variable from method of class Ui_MainWindow(object) 【发布时间】:2020-06-21 22:12:19 【问题描述】:我创建了一个 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
我收到了这个error: AttributeError: 'Ui_MainWindow' object has no attribute 'folder_path'
。
如何访问 self.data 来填充表格?
【问题讨论】:
您的代码不完整(以供将来参考,您应始终提供minimal, reproducible example),但从外观上看,我会在此阻止您:您应该从不 编辑pyuic
的输出(也不要尝试模仿它创建的类)。阅读有关using Designer 的更多信息,了解如何正确使用这些文件。
我没有贴出所有的代码,因为里面有很多和这个查询无关的代码。到目前为止,我已经修改了 pyuic 内容并且它有效。我只需要知道如何从设置 ui 访问结果搜索功能,或者我是否必须创建另一个功能然后从那里访问它。我之前已经阅读了文档并搜索了解决方案。但我不知道该怎么做。
如前所述,如果没有 MRE,很难找到问题的根源,但您可能正在创建 Ui_MainWindow
实例并针对 QMainWindow 实例使用 setupUi
,这可能是错误的来源。我知道编辑 pyuic 文件“似乎”有效,但这不是建议的方法;原因之一是它会在类和它们实际所做的事情之间造成混淆。我强烈建议您创建一个使用 uic 类的新脚本,如上面链接中所述,并从那里实现您的代码。不要编辑 pyuic 生成的文件。
【参考方案1】:
您似乎在尝试使用“folder_path”属性而没有先创建它。 在你使用你的搜索功能之前,将这一行添加到你的类中:
self.folder_path = 添加/你的/路径/
我还会注意到,在您提供的代码中,搜索功能似乎是在类之外定义的(这可能只是自动格式化对堆栈溢出的影响)。为了使您的 self.folder_path 变量可以按名称使用,请仔细检查您是否已正确缩进以使其成为类方法。
【讨论】:
这里的问题是函数Setup UI指向函数Search的第一行而不是返回值。搜索功能属于同一类。我认为这个问题也可能是我将值返回给函数的方式。但是我需要将结果附加到字典中,然后才能将其作为可用的数据集返回以显示。【参考方案2】:我通过清理 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))
【讨论】:
以上是关于从类 Ui_MainWindow(object) 的方法访问变量的主要内容,如果未能解决你的问题,请参考以下文章