组合tkinter和pygame时不显示小部件

时间:2014-07-22 18:21:18

标签: python tkinter widget pygame

我正在使用tkinter和pygame制作音乐播放器应用程序。我在网上找到了一些实现这两个模块的方法(https://mail.python.org/pipermail/tutor/2012-September/091417.htmlUsing pygame features in Tkinter),但我的按钮不可见。 pygame屏幕显示正常,但我无法显示按钮。

这是我的代码缩短版本:

from tkinter import *
import tkinter.filedialog as tk
import tkinter.messagebox as tk2
import os
import pygame

playlist = ['song1.mp3', 'song2.mp3', 'song3.mp3', 'song4.mp3']

class Application(Frame):

    def __init__(self,master):
        super(Application, self).__init__(master)

        #create widgets
        self.playlistbox = Listbox(self, selectmode = SINGLE) #listbox
        for song in playlist:
            self.playlistbox.insert(END, song)
        self.playlistbox.grid(row = 1)
        self.playButton = Button(self, text = 'Play', command = self.play)  #button
        self.playButton.grid(row=1, column = 1)

        #pygame init
        embed = tk.Frame(root, width = 200 , height = 200)
        embed.pack()
        embed.pack(side = LEFT)
        os.environ['SDL_WINDOWID'] = str(embed.winfo_id())
        os.environ['SDL_VIDEODRIVER'] = 'windib'
        pygame.display.init() 
        windowSurface = pygame.display.set_mode((200,100))
        pygame.mouse.set_visible(True)

    def play(self):   #play song function
        pygame.mixer.music.stop()
        selectedSongs = self.playlistbox.curselection()
        pygame.mixer.music.load(self.playlistbox.get(0))
        pygame.mixer.music.play(0, 0.0)

root = Tk()
root.title('Text Editor')
root.geometry('700x600')
app = Application(root)
app.mainloop()

1 个答案:

答案 0 :(得分:1)

你在这里做的是真的过度杀伤。
我使用完全相同的东西编码了一个音乐播放器你在这里使用.. python,pygame和tkinter ..

你不需要初始化pygame的显示模块,请相信我,你不需要它..
我会告诉你我做了什么..

  

我使用了使用Sound类播放曲目的pygame音乐模块   我创建了一个名为 SoundPanel 的类,它从Frame类继承到组:音量标度,播放/停止检查按钮,以及用于查看曲目名称的前23个字母并添加一些点的标签曲目名称大于..
  为了使其可用,我添加了一个打开的文件按钮,用于向视图添加轨道(使用tkinter的文件对话框)(即创建播放轨道的新SoundPanel对象)和打开文件夹按钮将具有特定扩展名的所有文件(由用户使用包含文本框的对话框定义)添加到视图中。

我认为你不需要更多......
我不是说你必须模仿我的解决方案,但我认为你的解决方案太复杂了 顺便说一下,小部件没有显示,因为你必须在创建对象时打包框架。