前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python Tkinter实战——开发音频播放器

Python Tkinter实战——开发音频播放器

作者头像
arcticfox
修改2021-01-21 01:03:02
4K0
修改2021-01-21 01:03:02
举报

本篇为视频课程 tkinter入门详解 章节对应文档,请结合视频学习,地址见文末

4.2 自制音频播放器

支持本地音频以及流媒体在线播放。

UI 架子

预览

代码语言:javascript
复制
 1  from tkinter import *
 2  import tkinter.ttk as ttk
 3  from tkinter.font import Font
 4  from PIL import Image, ImageTk
 5  from resource import control_icon, bottom_icon
 6  from seekbar import Seekbar
 7  import Pmw
 8
 9
10  class AudioView(Tk):
11
12    def __init__(self):
13        super().__init__()
14        self._init_data_()
15        self._set_window_()
16        self._create_menu_bar()
17        self._create_top_view()
18        self._create_control_panel()
19        self._create_list_box()
20        self._create_bottom_view()
21
22
23  if "__main__" == __name__:
24    app = AudioView()
25    app.mainloop()

Tkinter 的细节问题

Tkinter 的各小控件在实际使用中,都会存在一些细节问题,这些细节问题不是在初识小控件的时候能弄明白的,需要有一定的实战经验,并结合具体的项目才能体会出来。

  • 设置窗体透明度

这部分描述,在tkinter文档中并未描述,我们需要查看tcl/Tk的 相关文档https://www.tcl.tk/man/tcl8.7/TkCmd/wm.htm ,关于窗口feature的设置,推荐阅览本人另一篇博客 传送门https://arcticfox.blog.csdn.net/article/details/89605240 利用这点能实现桌面悬浮控件,可用于歌词展现

代码语言:javascript
复制
1 self.wm_attributes("-alpha", 0.9)
  • LabelFrame的扩展用法
代码语言:javascript
复制
1  menu_frame = Frame(bg="black")
2
3  frame = LabelFrame(self, labelwidget=menu_frame, bg="black", borderwidth=2,
4                 padx=10, pady=8, relief="sunken")
  • Listbox的深入学习 给Listbox添加右键选中菜单
代码语言:javascript
复制
 1  self.list_box = Listbox(frame, bg="black", yscrollcommand=y_bar.set, fg="white",
 2                      xscrollcommand=x_bar.set, border=0, highlightthickness=0,
 3                      selectforeground="#F0F126", selectbackground="black",
 4                      activestyle="none", font=("微软雅黑", -18), height=8)
 5
 6  self.list_box.bind('<Double-Button-1>', self.list_selected)
 7  self.list_box.bind("<Button-3>", self.show_context_menu)
 8
 9  # 设置选中
10  if self.list_box.size() == 1:
11  self.list_box.selection_set(0)
12
13  def show_context_menu(self, event):
14  # 清除鼠标右键选中色
15  for i in range(self.list_box.size()):
16      self.list_box.itemconfig(i, background="black")
17
18  # 获取当前鼠标右键选中的索引
19  index = self.list_box.nearest(event.y)
20  # 选中后改变背景色
21  self.list_box.itemconfig(index, background="gray")
22
23  self.context_menu.entryconfigure(0, command=lambda: self.remove_at(index))
24  self.context_menu.tk_popup(event.x_root, event.y_root)

  • Canvas与自定义控件 该项目中,我们主要自定义的是一个音频进度条控件Seekbar。主要使用Canvas的coords函数来移动对象,关于Canvas支持的一些功能,列举如下
  • create_arc():绘制弧。
  • create_bitmap():绘制位图。
  • create_image():绘制图像。
  • create_line():绘制线段。
  • create_oval():绘制椭圆。
  • create_polygon():绘制多边形。
  • create_rectangle():绘制矩形。
  • create_text():绘制文本。
  • create_window():绘制矩形窗口。 在Seekbar中,我们监听了鼠标按下和移动事件,关于事件的修饰符,可以查看tcl/Tk的官方文档,内容比tkinter要全面很多,相关部分文档https://www.tcl.tk/man/tcl8.7/TkCmd/bind.htm

VLC 多媒体框架

它是一款自由、开源的跨平台多媒体播放器及框架,全面支持绝大部分的多媒体格式,以及各类流媒体协议。也就是说,使用它既能播放本地音视频文件,也能在线播放各类流媒体资源。

关于VLC的安装与详细使用,请阅览本人博客 传送门https://blog.csdn.net/yingshukun/article/details/89527561

Tkinter 与异步编程

关于在Tkinter中使用消息队列 + 多线程 实现异步任务方法,我早前已写过详细博客 传送门https://blog.csdn.net/yingshukun/article/details/78838395 看一下博客即可。

当前这个项目,我们将使用另一种更加简洁高效的方式实现异步任务——线程池

代码语言:javascript
复制
 1  from concurrent.futures import ThreadPoolExecutor
 2
 3
 4  class RequestTask():
 5    task = None
 6
 7    def __init__(self):
 8        self.executor = ThreadPoolExecutor(max_workers=1)
 9
10    # 用submit添加耗时任务,该函数会立即返回,不会阻塞
11    def request(self, url, count):
12        self.task = self.executor.submit(get_music_list, url, count)
13
14    # 检查异步任务是否执行完成
15    def check_task(self):
16        return self.task.done()
17
18    # 获取异步任务执行结果
19    def get_result(self):
20        return self.task.result()

遗留问题

  1. 该视频播放器为简单实现,后续大家可以添加收藏、本地歌单、网易云音乐本地缓存、在线歌单筛选、桌面歌词等等功能
  2. 对于VCL库的所有调用均在主线程中进行,当VCL库的API耗时或阻塞时,会造成界面无响应。要改善该问题,可以考虑将音频播放移入后台线程中运行,而不阻塞前台的GUI
  3. 本地音频文件格式筛选,不要将非音频文件导入
  4. 响应快捷键,包括控制栏上的播放、暂停、快进等
  5. 界面美化

完整项目源码 传送门

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程之路从0到1 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本篇为视频课程 tkinter入门详解 章节对应文档,请结合视频学习,地址见文末
  • 4.2 自制音频播放器
    • UI 架子
      • Tkinter 的细节问题
        • VLC 多媒体框架
          • Tkinter 与异步编程
            • 遗留问题
            相关产品与服务
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档