Python tkinter创建Ui,button触发函数里实现转线程,关闭Ui后函数被再次调用问题

问题引入:

写自动化测试工具的时候, 用了thinter实现简单的界面,以实现,交互显示和设置配置项,显示动态测试过程中日志,“开始测试”按钮触发这个整个自动化测试流程。 

因为整个自动化测试是测试的【一个客户端】,中间是会底层利用win32api启动【这个客户端】的。 

最后发现:当整个测试完成后,按X按钮关闭测试UI的时候,需测试的客户端又被启动了。 看日志发现是,整个测试流程又开始走一遍。 最后发现是if __name__=="__main__"引起的。

 

详细说下:

如上图所以问题。在pychorm中并不会出现问题,只有当打包编译成exe后运行,关闭UI后出现重复运行的情况。

问题验证:

创建文件mymain.py(相当于上面画图举例的文件a.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/8/28 16:25
# @Author  : lishenluo

import threading
import mytt
from tkinter import *

def ui_start():
    win = Tk()
    # 设置标题
    win.title("我是测试")
    win.geometry("300x200+100+100")
    button = Button(win, text='我是按钮', font=('Arial', 12), width=12, height=1, command=button_function)
    button.pack()
    win.mainloop()

def button_function():
    th = threading.Thread(target=mytt.start, args=())
    th.start()

if __name__=="__main__":
    ui_start()

创建文件mytt.py(相当于上面画图举例的文件b.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/8/28 16:24
# @Author  : lishenluo


import logging

logging.basicConfig(filename="test.log", filemode="w",
                    format="[%(asctime)s][%(name)s][%(levelname)s]%(message)s",
                    datefmt="%Y-%m-%d %H:%M:%S", level=logging.DEBUG)

logging.info("this is before if __name__:%s"%__name__)

def start():
    logging.info("你是大笨蛋") #整个自动化测试开始入口函数

if __name__=='__main__':
    start()
    logging.info("this is after if __name__:%s"%__name__)

在pycharm运行结果,X关闭窗口后日志也不变,说明没有多余的运行。

利用pyinstaller编译出exe,对应mymain.spec文件如下

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['mymain.py','mytt.py'],
             pathex=['E:\\JQCode\\jqtests\\threadUiTest'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='threadUITest',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='threadUITest')

利用cmd,去到对应目录下,编译出exe文件

最后pycharm代码目录结构,编译出的exe文件在dist下

运行并查看日志:

 

结语:有不明白的欢迎留言

ps:验证了一下,中间不转线程一样会出现问题

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值