GUI python tkinter зависает и кнопка музыкального плеера не будет работать более одного раза
Как сделать так, чтобы кнопка воспроизведения работала столько раз, сколько возможно, а также могла использовать оставшуюся часть графического интерфейса и не зависать.
Я хотел бы иметь возможность использовать кнопку воспроизведения несколько раз, но он продолжает говорить
TypeError: невозможно выбрать объекты _tkinter.tkapp
и когда я использую потоки, он скажет RunTime Error:
Потоки могут быть запущены только один раз
from tkinter import *
from tkinter import filedialog
import os
import winsound
import threading
import time
import multiprocessing
audio_list = []
class Main(Frame):
def __init__(self, master):
Frame.__init__(self, master, bg="white")
self.audio_dictionary=audio_list
self.gui()
self.refresh()
Thread_1 = multiprocessing.Process(target=self.gui, args=(self,))
Thread_1.start()
def gui(self):
self.Thread_2 = multiprocessing.Process(target=self.play, args=(self,))
self.play_button= Button(text='Play', command=self.play)
self.play_button.grid(column=0, row=1, sticky='W')
stop_button= Button(text="Stop", command=self.stop)
stop_button.grid(row=1, column=0, columnspan=2, sticky='E')
self.display_songs = Listbox(bd=5, relief=GROOVE)
self.display_songs.grid(row=0, column=0, columnspan=2)
import_button = Button(text="Import", command=self.import_files)
import_button.grid(row=1, column=2, sticky='E')
self.status_window = Listbox(bd=5, relief=GROOVE)
self.status_window.grid(row=0, column=2)
def import_files(self):
self.selected_songs=filedialog.askopenfilenames(filetypes = [("wav file", "*")], title='Select wav files')
counter=0
for y in self.selected_songs:
x=os.path.basename(y)
self.audio_dictionary.append((x,y))
print(x)
self.display_songs.insert(counter, x)
counter+=1
for p in self.audio_dictionary:
print(p)
def play(self):
if self.Thread_2.is_alive() is True:
selection = self.display_songs.curselection()
for item in selection:
song=self.display_songs.get(item)
for c in self.audio_dictionary:
s=c[0]
if song==s:
direct=c[1]
else:
pass
print(direct)
winsound.PlaySound(direct, winsound.SND_FILENAME)
else:
pass
def refresh(self):
window.update()
window.after(100, self.refresh)
def stop(self):
print("Stopped Music")
winsound.PlaySound(None, winsound.SND_FILENAME)
window = Tk()
app = Main(window)
window.mainloop()
1 ответ
Вы должны избегать использования потоков. В частности, не выполняйте вызовы методов графического интерфейса Tkinter из рабочих потоков. Но в этом примере вам не нужны никакие потоки, так как функция winsound уже поддерживает асинхронное воспроизведение звуков:
winsound.PlaySound(filename, winsound.SND_FILENAME | winsound.SND_ASYNC)
Как задокументировано, если вы хотите остановить воспроизводимый в данный момент звук, передайте None в качестве первого аргумента.