【发布时间】:2016-03-01 13:15:25
【问题描述】:
我正在用 Python 构建一个简单的音频播放器。但是,当我添加一首歌曲时,数据字段为空,但当我按下播放按钮时歌曲能够开始播放。此外,单选按钮 IntVar 无论如何都会返回 0。所以这个问题与 StringVars 和 IntVar 有关。我认为它与窗口的范围有关,但即使我不破坏它,它仍然不起作用。我也尝试使用 Global 作为变量。任何帮助,将不胜感激。另外,我知道我的代码没有经过优化,但请仅评论我可能遇到问题的原因。
from tkinter import *
import pygame
from MusicPlayer.DoublyCircularLLClass import *
from tkinter import filedialog
from tkinter import messagebox
class songClass:
def __init__(self, songname, songartist, songalbum, songfilename):
self.name = songname
self.artist = songartist
self.album = songalbum
self.filename = songfilename
return
class MusicPlayer:
def __init__(self):
pygame.mixer.init()
self.nodeList = DoublyLinkedList()
root = Tk()
root.title('The Better iTunes')
paused = False
database = open('SongDatabase.txt', 'r')
read = database.readlines()
database.close()
for line in read:
read = line.strip()
tempsong = read.split(',')
self.nodeList.addToRear(songClass(tempsong[0], tempsong[1], tempsong[2], tempsong[3]))
self.currentSong = self.nodeList.firstNode
pygame.mixer.music.load(self.nodeList.firstNode.data.filename)
self.nameLabel = Label(root, text = self.currentSong.data.name)
self.nameLabel.pack(side= LEFT)
self.artistLabel = Label(root, text = self.currentSong.data.artist)
self.artistLabel.pack(side= LEFT)
self.albumLabel = Label(root, text = self.currentSong.data.album)
self.albumLabel.pack(side= LEFT)
#albumCoverLabel = Label(root, text = "")
Button(root, text='Play', command = self.playsong).pack(side= LEFT)
Button(root, text='Stop', command = self.stopsong).pack(side= LEFT)
self.pauseB = Button(root, text='Pause', command = self.pausesong)
self.pauseB.pack(side= LEFT)
Button(root, text='Next', command = lambda direction ="Next": self.updateSong(direction)).pack(side= LEFT)
Button(root, text='Previous', command = lambda direction ="Prev": self.updateSong(direction)).pack(side= LEFT)
Button(root, text='Delete', command = self.delete).pack(side= LEFT)
Button(root, text='Add', command = self.add).pack(side= LEFT)
Button(root, text='Search', command = self.search).pack(side= LEFT)
root.mainloop()
def playsong(self):
pygame.mixer.music.play()
self.pauseB["text"] = "Pause"
def pausesong(self):
global paused
if paused:
pygame.mixer.music.unpause()
self.pauseB["text"] = "Pause"
paused = False
else:
pygame.mixer.music.pause()
self.pauseB["text"] = "Resume"
paused = True
def stopsong(self):
pygame.mixer.music.stop()
self.pauseB["text"] = "Pause"
def delete(self):
self.currentSong = self.currentSong.next
self.nodeList.removeCurrent(self.currentSong.prev)
self.nameLabel["text"] = self.currentSong.data.name
self.artistLabel["text"] = self.currentSong.data.artist
self.albumLabel["text"] = self.currentSong.data.album
self.pauseB["text"] = "Pause"
return
def add(self):
self.addWindow = Toplevel()
self.addWindow.title('Enter Song Info')
addName = StringVar()
addArtist = StringVar()
addAlbum = StringVar()
nameEntry = Entry(self.addWindow, textvariable = addName).pack(side=LEFT)
artistEntry = Entry(self.addWindow, textvariable = addArtist).pack(side=LEFT)
albumEntry = Entry(self.addWindow, textvariable = addAlbum).pack(side=LEFT)
filenameLocation = filedialog.askopenfilename()
Button(self.addWindow, text='Submit', command = lambda name = addName.get(), artist = addArtist.get(), album = addAlbum.get(), filename = filenameLocation: self.updateList(name, artist, album, filename)).pack(side= LEFT)
return
def updateList(self, name, artist, album, filename):
self.nodeList.addToRear(songClass(name, artist, album, filename))
self.addWindow.destroy()
return
def search(self):
self.searchWindow = Toplevel()
self.searchWindow.title('Search Song')
selection = IntVar()
selection.set(0)
radioA = Radiobutton(self.searchWindow, variable=selection, value=0)
radioB = Radiobutton(self.searchWindow, variable=selection, value=1)
radioA.pack()
radioB.pack()
searchInfo = StringVar()
searchEntry = Entry(self.searchWindow, textvariable=searchInfo).pack(side=LEFT)
Button(self.searchWindow, text='Search', command=lambda info=searchInfo.get(), type=selection.get(): self.updateSearch(type, info)).pack(side=LEFT)
return
def updateSearch(self, type, info):
self.searchWindow.destroy()
searchSong = self.nodeList.firstNode
print(type)
if type == 0:
for i in range(self.nodeList.size):
if searchSong.data.name == info:
self.currentSong = searchSong
self.nameLabel["text"] = self.currentSong.data.name
self.artistLabel["text"] = self.currentSong.data.artist
self.albumLabel["text"] = self.currentSong.data.album
self.pauseB["text"] = "Pause"
break
else:
print(searchSong.data.name)
print(info)
searchSong = searchSong.next
messagebox.showinfo('Error', 'Song not found')
else:
for i in range(self.nodeList.size):
if searchSong.data.artist == info:
self.currentSong = searchSong
self.nameLabel["text"] = self.currentSong.data.name
self.artistLabel["text"] = self.currentSong.data.artist
self.albumLabel["text"] = self.currentSong.data.album
self.pauseB["text"] = "Pause"
break
else:
searchSong = searchSong.next
messagebox.showinfo('Error', 'Artist not found')
return
def updateSong(self, direction):
if direction == "Next":
pygame.mixer.music.load(self.currentSong.next.data.filename)
self.currentSong = self.currentSong.next
else:
pygame.mixer.music.load(self.currentSong.prev.data.filename)
self.currentSong = self.currentSong.prev
self.nameLabel["text"] = self.currentSong.data.name
self.artistLabel["text"] = self.currentSong.data.artist
self.albumLabel["text"] = self.currentSong.data.album
self.pauseB["text"] = "Pause"
return
m1 = MusicPlayer()
【问题讨论】:
-
欢迎来到stackoverflow!您可能需要大大减少代码,以便人们更容易帮助您。你能写出更短的示例代码吗?