笔者工作业余时间也没什么爱好,社交圈子也小,主要娱乐就是背着自己带电瓶的卖唱音响到住地附近找个人多的位置唱唱KtV。

硬件上点歌就用笔记本电脑,歌曲都是网上下载的mkv格式的含有两个音轨的视频。因此点歌软件成了笔者的需求。

点歌软件需求极简单:

  • 读磁盘上的目录取全部music,双击则调用播放器播放music。
  • 自己常唱的歌曲可以选到自选歌曲列表。
  • 支持按简拼搜索music

之前已经用多种开发工具写过,这次逢学习python的机会用它再写一个python版。

软件界面如下:

双击启动播放器。

就代码量上和用笔者用C#写的相同功能的软件对比下:

C#版软件提供的功能与本例子是完全相同。工作逻辑代码约230行,设计器代码(界面代码,系统自动生成)约210行,还不算汉字转拼音类的代码。

python版界面加工作逻辑代码一起约150行。也因此,笔者在编写python版的music时,明显感觉到python的代码精练浓缩(何况笔者只是初学python几天)。

c#版的相同功能的软件

完整的代码如下(python3.6.1环境下开发):

  1 from tkinter import *
  2 import tkinter.messagebox as messagebox
  3 from xpinyin import Pinyin
  4 import os
  5 import win32api
  6 import win32con
  7
  8 class music():
  9     __musicPlayPath='D:\\Program Files (x86)\\SPlayer\\splayer.exe'
 10     __userMusicDiskFilePath='D:\\usermusic.txt'
 11     __musicDefaultList=[]
 12     musicCurList=[]
 13     __userSelMusicList=[]
 14     def __init__(self,musicPath):
 15         self.__musicPath=musicPath
 16
 17     def delUserMusicListItem(self,item):
 18         if item in music.__userSelMusicList:
 19             music.__userSelMusicList.remove(item)
 20             messagebox.showinfo('提示','删除成功!')
 21
 22     def addUserMusicListItem(self,item):
 23         if not(item in music.__userSelMusicList):
 24             music.__userSelMusicList.append(item)
 25
 26     def readUserMuslicList(self):
 27         return  music.__userSelMusicList
 28
 29     def getSerachList(self):
 30         return  music.musicCurList
 31
 32     def setDefaultMuslic(self):
 33         music.__musicDefaultList = self.readMusicFromDisk()
 34
 35     def readDefaultMuslic(self):
 36         return music.__musicDefaultList
 37
 38     def getMusicListByUserKey(self,searchTxt):
 39         print(searchTxt)
 40         if str(searchTxt).__len__()<1:
 41             music.musicCurList=music.__musicDefaultList[:]
 42             return
 43         music.musicCurList.clear()
 44         p = Pinyin()
 45         for m in music.__musicDefaultList:
 46             py = p.get_initials(m, '')
 47             if (py.upper()).find(searchTxt.upper())>=0:
 48                 music.musicCurList.append(m)
 49
 50     def saveUserMusicListToDisk(self):
 51         f=open(music.__userMusicDiskFilePath,'w')
 52         tmpAry=music.__userSelMusicList[:]
 53         def addReturn(x):
 54             return x+'\n'
 55         f.writelines(map(addReturn, tmpAry))
 56         f.close()
 57
 58     def loadUserMusicListFromDisk(self):
 59         self.ifNotFileExistCreateEmptyFile()
 60         f=open(music.__userMusicDiskFilePath,'r')
 61         music.__userSelMusicList.clear()
 62         tmpAry=f.readlines()
 63         def delReturn(x):
 64             return x[0:len(x)-1]
 65         music.__userSelMusicList=list(map(delReturn, tmpAry))
 66         f.close()
 67
 68     def ifNotFileExistCreateEmptyFile(self):
 69         if not(os.path.exists(music.__userMusicDiskFilePath)):
 70             f = open(music.__userMusicDiskFilePath, 'a')
 71             f.close()
 72
 73     def readMusicFromDisk(self):
 74         music.__musicDefaultList= [d for d in os.listdir(self.__musicPath) if d.upper().find(".MKV")>=0]
 75         return  music.__musicDefaultList
 76
 77     def playMusic(self,event):
 78         w = event.widget
 79         index = int(w.curselection()[0])
 80         value = w.get(index)
 81         win32api.ShellExecute(0, 'open', music.__musicPlayPath,
 82                               '\"'+ self.__musicPath+value+'\"', '', 1)
 83
 84 class gui(music):
 85
 86     def __init__(self,winName):
 87         self.winName=winName
 88         self._music__musicPath='D:\\KuGou\\'
 89         self.lbx = StringVar()
 90
 91     def addMusicToUserList(self):
 92         index = int(self.listbox1.curselection()[0])
 93         value = self.listbox1.get(index)
 94         print(value)
 95         self.addUserMusicListItem(value)
 96         self.saveUserMusicListToDisk()
 97         messagebox.showinfo('成功','已经添加歌曲 \"'+value+'\"!')
 98
 99     def UpdateUserMusicList(self):
100         self.lbx.set(self.readUserMuslicList())
101
102     def searchMusic(self,event):
103         w = event.widget
104         txt = w.get()
105         self.getMusicListByUserKey(txt)
106         self.lbx.set(self.getSerachList())
107
108     def delUserMusic(self):
109         index = int(self.listbox1.curselection()[0])
110         value = self.listbox1.get(index)
111         self.delUserMusicListItem(value)
112         self.lbx.set(self.readUserMuslicList())
113         self.saveUserMusicListToDisk()
114
115     def allmusic(self):
116         self.lbx.set(self.readDefaultMuslic())
117
118     def initForm(self):
119         self.winName.title("music v1.0 by 刘小勇")
120         self.winName.geometry('600x480+10+10')
121         self.winName['bg']="pink"
122         self.winName.resizable(width=False,height=False)
123
124         self.btn1=Button(self.winName,text='全部歌曲',bg='lightblue',command=self.allmusic)
125         self.btn1.grid(row=1,column=1)
126         self.btn2=Button(self.winName,text='选中的歌曲',bg='lightblue',command=self.UpdateUserMusicList)
127         self.btn2.grid(row=1,column=2)
128         self.btn3=Button(self.winName,text='添加到选中的歌曲',bg='lightyellow',command=self.addMusicToUserList)
129         self.btn3.grid(row=1,column=3)
130         self.btn4=Button(self.winName,text='删除歌曲',bg='lightyellow',command=self.delUserMusic)
131         self.btn4.grid(row=1,column=4)
132
133         self.lab1=Label(self.winName,text='搜索:')
134         self.lab1.grid(row=1,column=5)
135         self.txt1=Entry(self.winName, width=20)
136         self.txt1.bind('<Return>',self.searchMusic)
137         self.txt1.grid(row=1,column=6)
138
139         self.scrollbar = Scrollbar()
140         self.scrollbar.grid(row=2,column=13,rowspan=13,sticky='NS')
141         self.listbox1=Listbox(self.winName,listvariable=self.lbx,width = 82,height=25,yscrollcommand=self.scrollbar.set)
142         self.setDefaultMuslic();
143         self.lbx.set(self.readDefaultMuslic())
144         self.listbox1.bind('<Double-Button-1>',self.playMusic)
145         self.listbox1.grid(row=2,column=1,columnspan=12)
146         self.scrollbar.config(command=self.listbox1.yview)
147         self.loadUserMusicListFromDisk()
148
149
150 tk=Tk()
151 form=gui(tk)
152 form.initForm()
153 tk.mainloop()

在编码过程中研究过的一些知识点汇集如下:

1.  如何在搜索框触发搜索后更新listbox, 这个是利用tkinter的 StringVar()

  参考笔者贴子:Python tkinter 控件更新信息

2.  控件listbox的滚动条

  参考笔者贴子:python tkinter Listbox用法

3. 控件的事件绑定

  参考笔者贴子:python tkinter教程-事件绑定

4. 控件的布局

  参考笔者贴子:python tkinter学习——布局

5. 高阶函数

  参考笔者贴子:python 函数式编程:高阶函数,map/reduce

6. 汉字转拼音

  参考笔者贴子:Python汉字转换成拼音

7. win32模块

  参考笔者贴子:Python中四种运行其他程序的方式

笔者写python程序时的开发ide集成环境是pycharm,在写tkinter代码时,关于控件的属性没有什么有意义的提示。因为去记住控件属性的完整拼写是不容易也是没有意义的事。

这也是写界面代码比较麻烦的地方。

长期依赖visual studio c#的IDE强大的语法提示、拼写补全功能, 已经让笔者手工编码的能力高度退化,对于没有属性提示的编程环境已经无法想像。

原创文章,出处 : http://www.cnblogs.com/hackpig/

Python Tkinter 学习成果:点歌软件music相关推荐

  1. Python tkinter 学习笔记(2)-- 控件、组件(一)

    Python tkinter 学习笔记(1)-- 第一个窗口之HelloWorld 教程 目录 一.Tkinter 15种基础控件 1. Button 按钮控件 2.Canvas 画图控件 3.Che ...

  2. Python tkinter 学习笔记(2)-- 控件、组件(二)

    Python tkinter 学习笔记(1)-- 第一个窗口之HelloWorld 教程 Python tkinter 学习笔记(2)-- 控件.组件(一) > 续上一章节 Python tki ...

  3. Python tkinter 学习笔记(3) -- 界面布局1(grid和pack)

    Python tkinter 学习笔记(1)-- 第一个窗口之HelloWorld 教程 Python tkinter 学习笔记(2)-- 控件.组件(一) Tkinter 界面布局(grid\pac ...

  4. python Tkinter学习笔记 menu控件 02

    2019独角兽企业重金招聘Python工程师标准>>> ''' Created on 2012-9-19@author: liangqianwu''' #_*_ coding:utf ...

  5. python自动点名程序_利用python+tkinter开发一个点名软件

    from win32com.client importDispatchfrom tkinter import * importtkinter as tkfrom PIL importImagefrom ...

  6. python tkinter 实现录屏软件

    详情看博客我的博客, 效果绝对好 截图:

  7. 基于Python Tkinter的多线程局域网扫描器

    #本文仅供参考有不足之处请指出 一.设计环境 系统:Windows 11 语言:python3.8 编译器:PyCharm 二.设计要求 1.局域网内的存活主机发现 2.扫描指定主机开放的端口 3.图 ...

  8. 如何使用Python tkinter 设计软件登录界面

    如何使用Python tkinter 设计登录界面 文章目录 前言 一.建立主窗口 二.建立子控件 1.Label标签控件与Entry输入控件 2.按钮Button 仅供交流学习禁止转载的声明 前言 ...

  9. python编程需要什么软件-《》 学习python编程需要安装哪些软件?

    python安装教程有没有?最好是视频的 廖雪峰的python教程这里有教程,还是不错的. 学Python要安装哪些软件? 一. 安装python 1. 从python下载相应的python安装包,打 ...

最新文章

  1. Linux下显示硬盘空间的两个命令
  2. emeditor利用书签功能导出匹配结果到新文件
  3. ChaosBlade:从混沌工程实验工具到混沌工程平台
  4. 树莓派3 kali linux很卡,树莓派3装kali Linux 成功写入 但是点不亮 为什么?
  5. 交换机工作原理及实验浅析
  6. ICallbackEventHandler不支持二次回调的问题
  7. Python 2.x vs Python 3.x(四)—— TypeError: unhashable type
  8. spring-boot推送实时日志到前端页面显示
  9. 末学者笔记--Python基础三玄
  10. pattern.compile java_Java Pattern compile(String)用法及代码示例
  11. mysql通过Navcat 备份数据.psc 还原数据时 只有表没有数据解决方法
  12. adb命令之service call
  13. word2007 正文自动变为大纲一级 问题
  14. linux postfix 虚拟,postfix虚拟别名域的配置
  15. 初学pwn-攻防世界(get_shell)
  16. 【MATLAB-app】摸索2天,果断放弃gui,彻底爱上了appdesigner。
  17. 绯闻女孩传八卦也能作为区块链协议?10分钟告诉你为啥
  18. android项目实战 博学谷 代码,《Android项目实战-博学谷》登录注册
  19. 菜鸟看马云卸任以及未来的阿里巴巴
  20. 西北工业大学计算机二级考点,2020年3月全国计算机等级考试报名通知

热门文章

  1. 佛家四大经典爱情故事
  2. 怎么在CAD中输入文字?分享CAD制图入门教程
  3. 语音识别技术分类与总结
  4. 腾讯乐享成为国内首家通过ISO27001认证的企业社区平台
  5. 第6代无线技术802.11ax详解(技术构成、特点、误区)
  6. 设计模式之(结构模式)组合模式
  7. 关于印发进一步改善护理服务行动计划(2023—2025年)的通知
  8. 计算机网络插座布线安装的过程,计算机网络与布线.ppt
  9. 发明专利可以增加几个申请人
  10. 如何在改变mfc控件上文字的字体和颜色