#python #multithreading #arraylist #pygame
#python #многопоточность #arraylist #pygame
Вопрос:
В настоящее время я пытаюсь создать функцию списка воспроизведения для запуска в фоновом режиме моего кода. Я использую потоковую обработку и pygame, а список воспроизведения представляет собой список массива. Я продолжаю получать эту ошибку:
Exception in thread Thread-4:
Traceback (most recent call last):
File "C:UsersharryAppDataLocalProgramsPythonPython38libthreading.py", line 932, in
_bootstrap_inner
self.run()
File "C:UsersharryAppDataLocalProgramsPythonPython38libthreading.py", line 870, in run
self._target(*self._args, **self._kwargs)
TypeError: 'str' object is not callable
это соответствующий фрагмент кода:
from threading import Thread
from time import sleep
def playPlaylist(playlist):
mixer.init()
for music in playlist:
mixer.music.load(music)
mixer.music.play()
while mixer.music.get_busy():
sleep(1)
Thread(target=playPlaylist, args=(playlist)).start()
Репозиторий Github:https://github.com/M1st3rMinecraft/python-virtual-assistant
Ответ №1:
args
Параметром должен быть iterable
(например, кортеж или список), где каждый элемент становится аргументом функции playPlayList
. При указании args=(playlist)
круглые скобки, окружающие playlist
, не обозначают кортеж из одного элемента. Для этого вам нужно будет указать args=(playlist,)
. Таким образом, playlist
сам по себе интерпретируется как итерируемый, и каждый его элемент будет рассматриваться как отдельный аргумент для playPlayList
. В playlist
в данный момент должен быть только один элемент, потому что, если бы их было, например, 3, вы бы получили сообщение об ошибке, такое как:
TypeError: playPlaylist() takes 1 positional argument but 3 were given
Итак, вам нужно указать: args=(playlist,)
. Это проблема номер один.
Поскольку вам больше не передается playlist
первый и единственный элемент этого списка в качестве аргумента, это, вероятно, приводит ко второй ошибке. Но я бы подумал, что вы получите исключение в:
for music in playlist:
Но, возможно, первый элемент playlist
сам по себе является итеративным. Попробуйте устранить первую проблему и посмотрите, что произойдет.
Комментарии:
1. Я только что попробовал это, и это выдало мне ту же ошибку. Я попробовал первое исправление с пробелом после запятой и без него.
2. Пробел? Что важно, так это запятая, следующая за списком воспроизведения в
args=(playlist,)
3. Другой человек предложил то же самое, но с пробелом
4. Это было пространное предложение. Но если серьезно, я думаю, вы серьезно отнеслись к пробелу; в данном контексте это не имело бы значения. Когда вы передаете правильный список аргументов, вы получаете новое исключение или это «действительно то же самое точное исключение?» Вы включаете полную трассировку стека, чтобы мы могли определить, какой оператор в коде, который вы показываете, вызывает исключение?
5. да, после того, как я поставил запятую после списка воспроизведения, я получил ту же ошибку, и я поместил всю ошибку в свой первый пост и ничего не пропустил.
Ответ №2:
Попробуйте изменить, Thread(target=playPlaylist, args=(playlist)).start()
чтобы Thread(target=playPlaylist, args=(playlist, )).start()
это помогло в моем случае. А также проверьте все элементы в вашем коде, в котором вы вызываете функции, если они не являются строками. Если это не сработало, поделитесь своим файлом с классом mixer, чтобы я мог помочь вам в дальнейшем.
Комментарии:
1. где бы мне найти эти 2 файла, пожалуйста?
2. Извините, я думал, вы используете django. Пожалуйста, поделитесь кодом класса mixer.
3. Я использовал микшер еще где-то в своем скрипте, и это работает нормально, поэтому я бы подумал, что это будет потоковая обработка?
4. Я думаю, что эта ошибка вызвана не потоковой обработкой. Без остальной части кода трудно сказать больше.
5. вот github, который я только что создал для проекта, если это поможет: github.com/M1st3rMinecraft/python-virtual-assistant