You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将功能绑定到tkinter下拉列表,选中选项后展示对应内容

实现方案

你当前的程序运行截图如下:
当前程序运行截图

核心调整逻辑

  • 为OptionMenu绑定选中事件回调,每次用户选择歌手时触发内容更新
  • 预先存储所有歌手对应的图片、音频资源映射关系,无需为每个歌手单独定义播放/停止/图片加载方法
  • 把动态展示的图片、播放按钮、停止按钮设为实例属性,每次切换选中歌手时,先销毁上一个歌手的相关组件,再渲染当前选中歌手的对应内容,未选中歌手时默认不渲染任何动态组件

完整修改后代码

import pygame
from tkinter import *
from PIL import ImageTk, Image

root = Tk()

root.title("Hip-Hop-Flow")
root.iconbitmap("22.ico")
root.geometry("800x600")
pygame.mixer.init()


class Vini:
    def __init__(self):
        # 所有歌手的资源映射,可按需扩展
        self.rapper_info = {
            "Vinnie Paz": {"img": "vini.gif", "audio": "vinnie flow.mp3"},
            "Sean Price": {"img": "sean.gif", "audio": "sean flow.mp3"},
            "Big L": {"img": "bigl.gif", "audio": "bigl flow.mp3"},
            "Canibus": {"img": "canibus.gif", "audio": "canibus flow.mp3"}
        }
        self.rappers = list(self.rapper_info.keys())
        self.menu = StringVar()
        self.menu.set("List of rappers")

        # 下拉菜单绑定选中回调
        siis_chamoshla = OptionMenu(root, self.menu, *self.rappers, command=self.update_rapper_content)
        siis_chamoshla.configure(width=30, bg="white")
        siis_chamoshla.pack()

        # 初始化动态组件属性,默认都为None
        self.img_label = None
        self.play_button = None
        self.stop_button = None

    def update_rapper_content(self, selected_rapper):
        # 先销毁上一个歌手的所有动态组件
        if self.img_label:
            self.img_label.destroy()
        if self.play_button:
            self.play_button.destroy()
        if self.stop_button:
            self.stop_button.destroy()
        # 停止之前播放的音频
        pygame.mixer.music.stop()

        # 获取当前选中歌手的资源
        current_info = self.rapper_info[selected_rapper]
        # 加载展示图片
        self.rapper_photo = ImageTk.PhotoImage(Image.open(current_info["img"]))
        self.img_label = Label(image=self.rapper_photo)
        self.img_label.pack()

        # 播放方法
        def play_current():
            pygame.mixer.music.load(current_info["audio"])
            pygame.mixer.music.play(loops=0)

        # 停止方法
        def stop_current():
            pygame.mixer.music.stop()

        # 渲染按钮
        self.play_button = Button(root, text="Play", font=("Helvetica", 20), command=play_current)
        self.play_button.pack(pady=20)
        self.stop_button = Button(root, text="Stop", font=("Helvetica", 20), command=stop_current)
        self.stop_button.pack(pady=20)


pazienza = Vini()
root.mainloop()

注意事项

  • 你需要提前把其他3位歌手对应的图片、音频文件按照self.rapper_info里配置的命名放到程序同级目录,或修改配置里的路径为你本地实际文件路径
  • 初始状态下仅展示下拉框,选中任意歌手后才会渲染对应图片和按钮,切换歌手时会自动清空上一位歌手的内容和正在播放的音频

内容的提问来源于stack exchange,提问作者Michel Basquiat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:48:03