打包为exe的程序中调用了cmd窗口,调用的时候会自动弹窗,这个弹窗用pyinstaller的-w的方法是不行的,参考RT-ThreadStudio的方法是如下图写一个.bat文件,关闭弹窗回显

@echo off
cd /D %~dp0
pyocd.exe %*

但一个原因是 它是0.1.1版本太低了,另一个是它这个exe文件可能是二次封装了,比pyocd自带的要大好多,所以最后还是不用cmd了,用的是pyocd的api进行的擦写,因为前面读寄存器也用的api

主要是擦和写的代码,如下,碰见的坑是:使用powershell进行相同代码的调用的日志流可以正常显示,使用上位机ui的pyqt的文本框显示pyocd的下载日志流就崩了,原因是FileProgrammer的progress默认不指定相当于用的是sys.stdout,给它指定到print就行了,但这样的话牺牲了效果,只是简单的下载进度数字的显示,没有那种进度条了

class pyocd_exe():
    # def list():
    #     os.system('pyocd' + ' ' + 'list')

    def erase():
        session = ConnectHelper.session_with_chosen_probe(target_override="gd32f425rg")
        session.open()
        eraser = FlashEraser(session, FlashEraser.Mode.CHIP)

        eraser.erase([])
        session.close()

        print('erase sucess!!!\r\n')

    def flash(file_path):
        print("下载文件路径: " + file_path)
        print('下载中,请等待······\r\n')
        try:
            session = ConnectHelper.session_with_chosen_probe(target_override="gd32f425rg")
            with session:
                programmer = FileProgrammer(session,   # sys.stdout
                                            progress=print,
                                            chip_erase="sector",
                                            trust_crc=False,
                                            no_reset=False)
                programmer.program(file_path)

            session.close()
            r_v = 0
        except Exception  as e:
            traceback.print_exc()
            return 1

        if r_v == 0:
            print('flash sucess!!!\r\n')
            return 0

        else:
            print('flash fail!!!\r\n')
            return 3

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐