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:驗證了一下,中間不轉線程一樣會出現問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章