鱼C论坛

 找回密码
 立即注册
查看: 2839|回复: 23

开户线程后报错。

[复制链接]
发表于 2024-3-17 08:17:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
现有如下代码:

self.textEdit_5.setReadOnly(True)

按钮点击:
self.pushButton_3.clicked.connect(lambda: self.start_thread('xls'))

然后开启线程:
    def start_thread(self, file_type):
        thread = MyThread(file_type, self.File_Path)  # 将 File_Path 作为参数传递给 MyThread
        thread.start()

class MyThread(threading.Thread):
    def __init__(self, file_type, file_path):  # 接收 File_Path 参数并存储为实例属性
        super().__init__()
        self.File_Type = file_type
        self.File_Path = file_path

    def run(self):
        if self.File_Type == 'xls':
            file_name = "123.xls"
            # 拼接文件路径
            file_path = os.path.join(self.File_Path, file_name)
            Exclud_Book = xlrd.open_workbook(file_path)
        else:
            file_name = "123.xlsx"
            # 拼接文件路径
            file_path = os.path.join(self.File_Path, file_name)
            Exclud_Book = load_workbook(file_path)

       此时我打开self.textEdit_5想录入数据:
        self.textEdit_5.setReadOnly(False)

        
        for sheet_name in Exclud_Book.sheet_names():
           
            exclude_rows_input = input()
            if exclude_rows_input:
                self.exclude_rows = [int(row) - 1 for row in exclude_rows_input.split(',')]

            
            exclude_cols_input = input()
            if exclude_cols_input:
                exclude_cols = [convert_position(col) for col in exclude_cols_input.split(',')]

            exclude_rules[sheet_name] = {'1': exclude_rows, '2': exclude_cols}
           
        print(exclude_rules)



然后就报错:
Exception in thread Thread-1:
Traceback (most recent call last):
  File "D:\Tools\Python\Lib\threading.py", line 1045, in _bootstrap_inner
    self.run()
  File "C:\Users\ynyxs\Desktop\20240316\xtt031600.py", line 1080, in run
    self.textEdit_5.setReadOnly(False)
    ^^^^^^^^^^^^^^^
AttributeError: 'MyThread' object has no attribute 'textEdit_5'


请问是什么原因?

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-3-17 08:28:49 | 显示全部楼层
FishC 发表于 2024-3-17 08:17
报错原因是 'MyThread' 对象没有 'textEdit_5' 属性。这是因为在 MyThread 类中,它不知道关于界面窗口的任 ...

我一共有3个window:
class BaseWindow(QWidget):
    def __init__(self):
        super().__init__()

class WindowA(BaseWindow):
    def __init__(self):
        super().__init__()

class WindowB(BaseWindow):
    def __init__(self):
        super().__init__()


self.textEdit_5是放在WindowB中,但是我把你教我的改成下面这样:

class MyThread(threading.Thread):
    # 在 MyThread 类中,修改 `__init__` 方法,接收File_Path和window,并将其存储为实例属性:
    def __init__(self, file_type, file_path, windowB):
        super().__init__()
        self.File_Type = file_type
        self.File_Path = file_path
        self.window = windowB

还是报错:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "D:\Tools\Python\Lib\threading.py", line 1045, in _bootstrap_inner
    self.run()
  File "C:\Users\ynyxs\Desktop\20240316\xtt031600.py", line 1082, in run
    self.textEdit_5.setReadOnly(False)
    ^^^^^^^^^^^^^^^
AttributeError: 'MyThread' object has no attribute 'textEdit_5'


请问是什么原因?





小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-17 10:43:59 | 显示全部楼层
FishC 发表于 2024-3-17 08:29
报错的原因是 `MyThread` 类仍然没有 `textEdit_5` 属性,因为你在 `MyThread` 类中存储了 `windowB`, ...

照这样计算,那我WindowB有多少控件就得这样全部传递吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-17 10:52:40 | 显示全部楼层
本帖最后由 凊风 于 2024-3-17 10:54 编辑
FishC 发表于 2024-3-17 10:44
是的,如果你想在 `MyThread` 类中访问 `WindowB` 中的多个控件,那么你需要将这些控件都作为参数传递 ...


我用的是PySide6,并且各个控件(比如说有6个按钮)执行的任务都不相同,又要怎么处理呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-17 10:54:38 | 显示全部楼层
FishC 发表于 2024-3-17 10:53
在 PySide6 中,也可以使用信号和槽机制来实现线程与界面之间的通信。每个控件执行不同任务的情况下, ...

我用的是PySide6,并且各个控件(比如说有6个按钮)执行的任务都不相同,又要怎么处理呢?

回复请注意Python格式
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-17 10:57:07 | 显示全部楼层
FishC 发表于 2024-3-17 10:54
在PySide6中,可以通过使用lambda表达式和信号参数来处理多个控件执行不同任务的情况。以下是一个示例 ...

可能我没表达清楚,我重新开贴来问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-17 11:11:53 | 显示全部楼层
FishC 发表于 2024-3-17 10:44
是的,如果你想在 `MyThread` 类中访问 `WindowB` 中的多个控件,那么你需要将这些控件都作为参数传递 ...

这里没看到`MyThread` 类啊。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-17 11:15:01 | 显示全部楼层
FishC 发表于 2024-3-17 11:12
非常抱歉,之前的回答中使用的是 PyQt5 的示例代码。如果你使用的是 PySide2,可以按照以下方式实现线 ...

我用的是PySide6,并且窗体B中有6个按钮,各个按钮的功能又不相同,请问要如何 处理呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-17 11:20:36 | 显示全部楼层
FishC 发表于 2024-3-17 11:15
如果窗体B中的按钮具有不同的功能,你可以根据每个按钮的点击事件单独处理。以下是一个示例代码,展示 ...

为了防止程序 卡死,需要开启多线程。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-17 11:24:58 | 显示全部楼层
FishC 发表于 2024-3-17 11:20
如果你想在窗体B中处理按钮点击事件时使用多线程,以防止程序卡死,可以考虑使用`QThread`来创建多线程 ...

回复请注意python格式
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-17 11:50:00 | 显示全部楼层
FishC 发表于 2024-3-17 11:31
非常抱歉,我将以正确的 Python 格式重新给出示例代码:

各个按钮(比如说pushButton_1到pushButton_6)的click事件不一样的,那各个按钮的耗时操作要怎么处理呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-17 12:06:46 | 显示全部楼层
FishC 发表于 2024-3-17 11:50
如果每个按钮的耗时操作不同,我们可以针对每个按钮单独创建不同的工作线程。下面是一个示例代码,演示 ...

我先试着照这样写一下,有问题再来咨询。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-21 03:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表