【问题标题】:Python: Entry Box String Variables Returning NonePython:输入框字符串变量返回无
【发布时间】: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!您可能需要大大减少代码,以便人们更容易帮助您。你能写出更短的示例代码吗?

标签: python class tkinter


【解决方案1】:
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)

您的命令是巨大的 lambda 函数。 lambda 函数有很多默认参数。这些默认参数在您创建函数时(而不是在您调用它时)进行评估。那时你的变量(addNameaddArtist等)还是空的。

您需要命令函数仅在单击按钮时评估 addName.get()(因此在 lambda 函数中,尽管我建议只使用常规函数)而不是在默认参数列表中。

附带问题:如果您的 Entry 非常短暂,则不需要使用 StringVars。你可以直接使用my_entry.get()

【讨论】:

  • 非常感谢,成功了。我曾尝试不使用 lambda,而只是将 StringVars 设为全局并获取它们而不是传递参数,但这也不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2013-09-18
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多