python和tkinter写了一个豆瓣音乐下载工具

前天自己的阿里妈妈账号再次被冻结了,好不容易有5000多收入,一下又没了。

没办法,还是拿自己的一点小手艺,赚点吃饭的钱,花一天时间写了这个小工具。

douban-music-downloader

可以下载豆瓣的红心兆赫、豆瓣小站大部分专辑。下载任意兆赫的功能没有写,时间有限。

douban-downloader-main

这个程序我希望能够收费提供,所以虽然公开代码,但并不希望你生成无限制的exe免费提供,请谅解。

Tkinter是single-threaded,记住这一点比较重要。 对于耗时的操作,比如下载,需要创建新的线程来完成。

我在程序启动时创建了5个daemon线程,用于下载MP3,一般,5个线程就足够达到较好的下载效率。

windows可执行文件 (请注意,文件夹名称中不能存在中文)

下载源代码 (如果你做了任何改进,欢迎提交给我。 :))

《python和tkinter写了一个豆瓣音乐下载工具》上有21条评论

      1. self.lbl_CAPTCHA.image = CAPTCHA_img = PhotoImage(file=’CAPTCHA.jpg’) ^IndentationError: unindent does not match any outer indentation level

  1. 博主,我在fedora下跑这个程序,不行。貌似在linux下,非主线程不可以更新GUI。那个获取验证码显示验证码就在非主线程里。不工作。windows下倒是工作。我现在用app.root.after()来判断验证码有没有下载好,下载好了就显示。请问博主,你学习tkinter参考哪些资料哇?好像python官方的资料好少哇。比如那个withdraw方法,我在ptyhon doc上就木有找到。。。。

    1. 现有的代码并没有在另一个线程中直接刷新Label,也是通过after()来更新的,第35行:self.root.after(10, self.lbl_CAPTCHA.update_idletasks),这份代码我在Ubuntu下有测试过,还没遇到你描述的问题。 之前看的是这份:http://effbot.org/tkinterbook/, 算是相对完整的。

      1. 运行到第33行就报错了。[gaoshijie@gaoshijie douban-music-downloader]$ python ./doubanFM.py Fontconfig warning: “/etc/fonts/conf.d/50-user.conf”, line 14: reading configurations from ~/.fonts.conf is deprecated.Exception in thread Thread-1:Traceback (most recent call last): File “/usr/lib64/python2.7/threading.py”, line 811, in __bootstrap_inner self.run() File “/usr/lib64/python2.7/threading.py”, line 764, in run self.__target(*self.__args, **self.__kwargs) File “./doubanFM.py”, line 33, in downCAPTCHA self.lbl_CAPTCHA.image = CAPTCHA_img = PhotoImage(file=’CAPTCHA.jpg’) File “/usr/lib64/python2.7/site-packages/PIL/ImageTk.py”, line 118, in __init__ self.__photo = tkinter.PhotoImage(**kw) File “/usr/lib64/python2.7/lib-tk/Tkinter.py”, line 3306, in __init__ Image.__init__(self, ‘photo’, name, cnf, master, **kw) File “/usr/lib64/python2.7/lib-tk/Tkinter.py”, line 3262, in __init__ self.tk.call((‘image’, ‘create’, imgtype, name,) + options)TclError: out of stack space (infinite loop?)Exception AttributeError: “PhotoImage instance has no attribute ‘_PhotoImage__photo'” in > ignored我把第33改成:self.lbl_CAPTCHA.config(text=u’我是一只小鸭子,一丫一丫哟。’)报错如下:[gaoshijie@gaoshijie douban-music-downloader]$ python ./doubanFM.py Fontconfig warning: “/etc/fonts/conf.d/50-user.conf”, line 14: reading configurations from ~/.fonts.conf is deprecated.Exception in thread Thread-1:Traceback (most recent call last): File “/usr/lib64/python2.7/threading.py”, line 811, in __bootstrap_inner self.run() File “/usr/lib64/python2.7/threading.py”, line 764, in run self.__target(*self.__args, **self.__kwargs) File “./doubanFM.py”, line 33, in downCAPTCHA self.lbl_CAPTCHA.config(text=u’我是一只小鸭子,一丫一丫哟。’) File “/usr/lib64/python2.7/lib-tk/Tkinter.py”, line 1262, in configure return self._configure(‘configure’, cnf, kw) File “/usr/lib64/python2.7/lib-tk/Tkinter.py”, line 1253, in _configure self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))TclError: out of stack space (infinite loop?)感觉还是属于非主线程修改GUI导致的。。。

        1. 看你的测试,很可能是这个原因。 可以再试试把对应的那条语句用lambda生成匿名函数放到after()方法中做参数,如果正常,就确定了。 不过我很疑惑如果那条语句有问题,那down_slave线程中lbl_status.config这行应该也会失败。 在Ubuntu上我也是用的python2.7,不知道跟版本有没有什么关系。Tkinter单线程确实需要很小心才能避免出问题,所以我打算稍后花点时间看看wxPython。

  2. 杰神,来翻看你的文章了。。。这几天试着也用c艹写个下载工具,发现各种API各种蛋疼,豆瓣返回那个JSON格式的,c艹也没有那个库,看了你这个,觉得python真好用(虽然我不懂python),我这种渣渣有杰兄一半水平就好咯。。。

    1. Python确实用起来舒服,几行代码就能做不少事。 类库太丰富了,所以只需要关心程序的逻辑和算法。 不过C++用好了更是牛逼,python不也是用的c库吗。 C/C++学得好,再玩python,会非常顺手,有时间你可折腾下。

  3. 大神,以后不更新了么???最近没什么可下载豆瓣FM音乐的工具,都变成不能用了,大神,求你更新一下吧!!!

发表评论

您的电子邮箱地址不会被公开。