Python 尝试引用对象时未定义名称x
下面的代码创建了一个带有日期选择器的简单窗口,以及一个激活其余代码的按钮(还不是最优雅的,我在这里暂时使用全局变量,以便“处理”脚本可以访问它们,这些将很快被删除) 问题是,当我创建MyWindow类的对象时,我似乎根本无法在Python 尝试引用对象时未定义名称x,python,class,pyqt5,Python,Class,Pyqt5,下面的代码创建了一个带有日期选择器的简单窗口,以及一个激活其余代码的按钮(还不是最优雅的,我在这里暂时使用全局变量,以便“处理”脚本可以访问它们,这些将很快被删除) 问题是,当我创建MyWindow类的对象时,我似乎根本无法在start\u processing()调用的函数中访问它 如果我随后尝试window1.set_text('Blah'),在函数start_processing()中,我会得到一个name错误:名称“window1”未定义 start_processing在脚本的主体中定
start\u processing()
调用的函数中访问它
如果我随后尝试window1.set_text('Blah')
,在函数start_processing()
中,我会得到一个name错误:名称“window1”未定义
start_processing在脚本的主体中定义,除此类中包含的函数外,其他所有函数都在脚本的主体中定义
不确定需要发布整个脚本的多少内容,但很乐意添加其他内容。语句window1=MyWindow()
在MyWindow()
完成执行之前,不会实际为变量window1
赋值。在MyWindow()
可以完成执行之前,\uuu init\uuuu()
必须完成执行。但首先必须完成执行setup\u ui
。但首先必须完成执行。但是只要窗口保持打开状态,exec
就会无限期地阻塞。因此,当用户单击一个按钮并在单击按钮时触发,则window1
将没有值
一种可能的解决方案是移动exec\uuu
调用,这样它就不会被\uuu init\uuu()直接或间接调用。例如,您可以在创建MyWindow()
之后,在文件级范围内调用它
在哪里定义了start\u处理
?请提供一个。在脚本的主体部分,将更新问题我将摆脱静态方法-我认为这可能是PyCharm应用的“修复”-谢谢!所有脚本都在同一个.py文件中。我是否需要将window1对象作为参数传递给调用MyWindow()方法的每个函数?这就是想法window1
对于start\u processing
文件中定义的函数本机不可见,因此您可以预期所有函数都无法找到window1
,除非您将其作为参数传递。谢谢。尽管所有函数都在文件的主体中声明。我认为如果函数在主体中定义(不是嵌套的),并且window1
也在主体中定义,那么它们会彼此可见吗?大约有6或7个不同的函数用于file\u search
调用(都在文件的主体中声明)。我假设我需要将window1
作为参数传递给调用MyWindow()
方法之一的每个函数。如果window1
和某些函数定义在同一范围内,则它们彼此可见是正确的。但是window1
和start\u处理
不在同一范围内<代码>开始处理
在一个文件中定义,而窗口1
在另一个文件中定义。每个文件都有自己的作用域。哦,我误解了这个问题。问题不是作用域,而是调用堆栈中语句的执行顺序。我将修改我的帖子。
import calendar
import os
from datetime import date
from glob import glob
from time import time
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QPushButton, QLabel, QErrorMessage
def start_processing():
start = time()
files_found: tuple = file_search(month, year, r'O:\test\1 Originals')
for i in files_found:
process_file(i)
duration = time() - start
window1.set_text(f'Generation of files took {duration:.1f} seconds!')
class MyWindow(object):
def __init__(self):
self.app = QApplication([])
self.progress = QLabel('Foo')
self.title = 'Bar'
self.left = 10
self.top = 10
self.width = 300
self.height = 300
self.error_dialog = QErrorMessage()
self.setup_ui()
def setup_ui(self):
self.app.setStyle('Fusion')
window = QWidget()
layout = QVBoxLayout()
combobox_month = QComboBox()
combobox_year = QComboBox()
layout.addWidget(self.progress)
layout.addWidget(combobox_month)
layout.addWidget(combobox_year)
combobox_month.addItems(calendar.month_name[1:13])
combobox_year.addItems(['2017', '2018', '2019', '2020'])
combobox_year.setToolTip('Select the year')
combobox_month.setToolTip('Select the month')
combobox_month.setCurrentText('January')
combobox_year.setCurrentText('2019')
process_button = QPushButton('Process')
layout.addWidget(process_button)
window.setLayout(layout)
combobox_month.currentTextChanged.connect(self.on_combobox_month_changed)
combobox_year.currentTextChanged.connect(self.on_combobox_year_changed)
process_button.clicked.connect(self.on_button_clicked)
window.setGeometry(self.left, self.top, self.width, self.height)
window.setWindowTitle(self.title)
window.show()
self.app.exec_()
@staticmethod
def on_button_clicked():
start_processing()
@staticmethod
def on_combobox_month_changed(text):
global month
month_lookup = {v: k for k, v in enumerate(calendar.month_name)}
month = month_lookup[text]
@staticmethod
def on_combobox_year_changed(text):
global year
year = int(text)
def set_text(self, text):
self.progress.setText(text)
self.app.processEvents()
def error_message(self, text):
self.error_dialog.showMessage(text)
if __name__ == '__main__':
window1 = MyWindow()
if __name__ == '__main__':
window1 = MyWindow()
window1.app.exec_()