Python 尝试引用对象时未定义名称x

Python 尝试引用对象时未定义名称x,python,class,pyqt5,Python,Class,Pyqt5,下面的代码创建了一个带有日期选择器的简单窗口,以及一个激活其余代码的按钮(还不是最优雅的,我在这里暂时使用全局变量,以便“处理”脚本可以访问它们,这些将很快被删除) 问题是,当我创建MyWindow类的对象时,我似乎根本无法在start\u processing()调用的函数中访问它 如果我随后尝试window1.set_text('Blah'),在函数start_processing()中,我会得到一个name错误:名称“window1”未定义 start_processing在脚本的主体中定

下面的代码创建了一个带有日期选择器的简单窗口,以及一个激活其余代码的按钮(还不是最优雅的,我在这里暂时使用全局变量,以便“处理”脚本可以访问它们,这些将很快被删除)

问题是,当我创建MyWindow类的对象时,我似乎根本无法在
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_()