上个版本的播放器可以实现简单的音乐播放,在测试的过程中发现时不时的会崩溃,
在网上找没找到解决办法,有说是pygame和tkinter不兼容的,有说tkinter有问题的。。。。。。
经过测试发现问题出在多线程上,反复测试才发现是多线程在资源分配上出问题,找到问题就好办了,既然是多线程的数据分配问题那就通过加锁解决,多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。
修改代码为:
#-*- coding: utf-8 -*- import tkinter import time import threading import pygame from tkinter import filedialog #测试过程发现经常崩溃,可能是线程切换导致数据错误,加锁保证线程不被其他线程占用 lock = threading.Lock() root = tkinter.Tk() root.title('音乐播放器v1.10') #root.iconbitmap('./mu.ico')#更换标题图标 root.iconbitmap('./mp.ico') #窗口大小及位置 root.geometry('460x600+500+100') root.resizable(False, False) playing = True res = [] files = [] num = 0 #添加文件函数 def buttonChooseClick(): # 选择要播放的音乐文件夹 global res global files fpath = filedialog.askopenfilenames(filetypes=(("File", "*.mp3;*.wav"),)) # 必须加逗号,为多个元组 files.append(list(fpath)) ret = [] del res[:] for i in files: for m in i: res.append(m) for i in files: for m in i: ret.append(m.split('/')[-1:]) var2 = tkinter.StringVar() var2.set(ret) lb = tkinter.Listbox(root, listvariable=var2) lb.place(x=50, y=100, width=260, height=300) # 根据情况禁用和启用相应的按钮 buttonPlay['state'] = 'normal' buttonStop['state'] =