我无法在我的 Python 项目中使用多线程
Posted
技术标签:
【中文标题】我无法在我的 Python 项目中使用多线程【英文标题】:I am having trouble getting multithreading working in my Python project 【发布时间】:2022-01-21 17:48:54 【问题描述】:我无法让线程在我的代码中工作。如果我取出线程,for循环会将menu.txt附加到menu = []。对于我的家庭作业,我需要更改它以使其与线程一起使用。这是我到目前为止所拥有的,但我一直想出一个异常“模块”对象不可调用。我觉得我很接近,但我错过了一些东西。
这是 itemClass.py -
class item(Thread): #class for the menu items
def __init__(self, name, wholeSale, retail, orderCount):
Thread.__init__(self)
self.name = name
self.wholeSale = wholeSale
self.retail = retail
self.orderCount = orderCount
这是 guiMain.py -
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
from PIL import ImageTk,Image
import manager
import restaurant
import itemClass
import threading
from threading import *
if __name__ == "__main__":
menu = []
t1 = itemClass.item()
t1.start()
with open("menu.txt") as f: #reads menu.txt to store in menu variable
for line in f.readlines():
arr = line.split(",")
menu.append(t1(arr[0],float(arr[1]),float(arr[2]),int(arr[3])))
mainGUI(菜单)
这是 menu.txt -
Chicken Sandwich,3.5,4.99,16
Spicy Chicken Sandwich,3.75,5.49,21
Chicken Tender Box,4.17,5.99,22
Spicy Tender Box,4.38,6.49,10
Fries,1.15,2.99,22
抛出的异常 -
Message=item.__init__() missing 4 required positional arguments: 'name',
'wholeSale', 'retail', and 'orderCount'
来源=C:\Users\neodr\Desktop\PythonClass\Lesson10_2051495\Lesson10Project2_2051495\guiMain.py 堆栈跟踪: 文件 “C:\Users\neodr\Desktop\PythonClass\Lesson10_2051495\Lesson10Project2_2051495\guiMain.py”,第 46 行,在(当前帧) t1 = itemClass.item()
【问题讨论】:
将错误的完整回溯显示为问题中格式正确的文本。 文件末尾是否有换行符? menu.txt 末尾有一个空行 等一下。您有一个名为item
的类,但您正在创建t1 = itemClass()
。 itemClass
在哪里?而且你的线程没有做任何事情——你没有start
或run
函数。它看起来像一个存储容器。您应该采取哪些行动来利用线程?
我编辑了它。它最初是 itemClass.item() 但我在玩东西时忘记将其切换回来。这只是一个大型项目的一小部分,我必须在其中引入线程。我只是想让它在第一部分工作,这样我就可以了解如何更改项目的其余部分。很抱歉造成混乱。
【参考方案1】:
您描述的错误是一个基本错误,实际上与线程本身没有任何关系。您定义的itemClass.item
类需要四个参数。当您尝试在 GUI 代码中创建类的实例时,您并没有这样做。当您执行t1 = itemClass.item()
时,您没有传递任何参数。稍后在您的代码中,您尝试使用参数调用 t1
,但这也不支持(您的类的实例不可调用)。
这些都没有多大意义。我怀疑潜在的问题是你试图将线程插入一个没有任何意义的地方。您应该希望一个线程在您正在进行的事情发生的地方运行,并且您希望它在您在主线程中执行其他操作时继续发生。您显示的代码部分似乎与它不匹配。您只是在这里定义菜单项。没有任何正在进行的事情需要线程。
您可能需要重新考虑这段代码的结构并将线程放在其他地方。例如,菜单项一旦被选中,就可以启动一个在后台持续运行的线程。但是线程创建将由 GUI 内容(从菜单中选择)触发,而不是在定义菜单项时预先创建和启动。
【讨论】:
是的,我在原始帖子中犯了一个错误。我解决了这个问题,但它仍然无法正常工作。 您能否编辑您的问题以同时显示您遇到的异常?给出完整的追溯!module object not callable
消息对代码的原始版本有意义,但不再有意义(您现在应该得到 item object not callable
)。此外,您应该显示您的导入,因为运行您显示的 guiMain
代码如果逐字运行会给出 itemClass
未定义的错误。
我想我有你想要的一切。
我已经更新了我的答案。在出现任何真正的线程问题之前,您的错误仍然是一个基本错误。但是您的设计可能存在主要线程问题,因此我也对它们发表评论。基本上:您显示的代码中不需要线程,它可能属于其他地方。
谢谢。我对 Python 和线程很陌生。我有一种感觉,也许我的线程不属于这里。我将查看我的代码,看看是否可以根据您为我的项目添加线程的建议提出不同的解决方案。我知道线程应该做什么,但我不确定我是否理解它应该如何正确实现。【参考方案2】:
1.你还没有在任何地方定义 itemClass 所以我假设你ment item 所以尝试: 从 itemClass 导入项目
t1 = item()
2.你还没有给item类的init方法传递任何参数
3.不清楚你想用线程实现什么
【讨论】:
以上是关于我无法在我的 Python 项目中使用多线程的主要内容,如果未能解决你的问题,请参考以下文章
raise ValueError(err) - 在 Python 中使用 concurrent.future 实现多线程