我的项目地址

https://github.com/jonssonyan...

开发工具

  1. python 3.7.9
  2. pycharm 2019.3.5

代码

import threadingimport timeimport tkinter.simpledialogfrom tkinter import END, simpledialog, messageboximport requestsclass Danmu():    def __init__(self, room_id):        # 弹幕url        self.url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory'        # 申请头        self.headers = {            'Host': 'api.live.bilibili.com',            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',        }        # 定义POST传递的参数        self.data = {            'roomid': room_id,            'csrf_token': '',            'csrf': '',            'visit_id': '',        }        # 日志写对象        self.log_file_write = open('danmu.log', mode='a', encoding='utf-8')        # 读取日志        log_file_read = open('danmu.log', mode='r', encoding='utf-8')        self.log = log_file_read.readlines()    def get_danmu(self):        # 暂停0.5避免cpu占用过高        time.sleep(1)        # 获取直播间弹幕        html = requests.post(url=self.url, headers=self.headers, data=self.data).json()        # 解析弹幕列表        for content in html['data']['room']:            # 获取昵称            nickname = content['nickname']            # 获取发言            text = content['text']            # 获取发言工夫            timeline = content['timeline']            # 记录发言            msg = timeline + ' ' + nickname + ': ' + text            # 判断对应音讯是否存在于日志,如果和最初一条雷同则打印并保留            if msg + '\n' not in self.log:                # 打印消息                listb.insert(END, msg)                listb.see(END)                # 保留日志                self.log_file_write.write(msg + '\n')                # 增加到日志列表                self.log.append(msg + '\n')            # 清空变量缓存            nickname = ''            text = ''            timeline = ''            msg = ''def bilibili(delay, room_id):    # 创立bDanmu实例    bDanmu = Danmu(room_id)    while True:        # 暂停避免cpu占用过高        time.sleep(delay)        # 获取弹幕        bDanmu.get_danmu()def author():    # 弹出对话框    messagebox.showinfo(title='对于', message='作者:阿壮Jonson\n日期:2021年2月4日\n微信公众号:科技猫')# tkinter GUIwindow = tkinter.Tk()window.title('BiliBli弹幕查看工具')window.minsize(300, 500)window.geometry('400x600+250+100')# 菜单栏menubar = tkinter.Menu(window)# Open放在菜单栏中,就是装入容器menubar.add_command(label='对于', command=author)# 创立菜单栏实现后,配置让菜单栏menubar显示进去window.config(menu=menubar)# 滚动条sc = tkinter.Scrollbar(window)sc.pack(side=tkinter.RIGHT, fill=tkinter.Y)# Listbox控件listb = tkinter.Listbox(window, yscrollcommand=sc.set)# 将部件搁置到主窗口中listb.pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=True)# 滚动条动,列表跟着动sc.config(command=listb.yview)# 获取字符串(题目,提醒,初始值)room_id = simpledialog.askstring(title='请输出房间号', prompt='请输出房间号:'                                 , initialvalue='21089733')if room_id is not None:    # 创立获取弹幕线程    try:        t = threading.Thread(target=bilibili, args=(0.5, str(room_id),))        t.setDaemon(True)        t.start()    except:        print("Error: 启动失败!请查看房间号是否正确")# 进入循环显示window.mainloop()

编译

应用第三方包:pyinstaller

命令

pyinstaller -F -w bilibli-danmu.py

参数解释

  • -F,-onefile 产生单个的可执行文件
  • -w,--windowed,--noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 无效)

PyInstaller 反对的罕用选项

补充

  1. 执行完命令之后会在我的项目目录下多出dist文件夹,编译后的文件就在该文件夹下
  2. pyinstaller 不能够跨平台编译,windows平台下只能编译成windows下的执行文件(.exe),同理mac linux也是一样