Python结合Selenium与Tkinter开发时如何避免弹出多个终端窗口
问题原因
你遇到的弹窗是Windows系统下ChromeDriver进程默认创建的控制台窗口,pyinstaller的-w参数仅能隐藏主程序的控制台,无法控制Selenium启动的子进程窗口属性。
解决方案
按以下步骤修改即可完全消除弹窗:
- 调整
mp.freeze_support()的调用位置
该方法必须放在主程序入口的最开头,放在类初始化内会导致多进程子进程异常弹窗。 - 配置ChromeDriver Service的窗口隐藏属性
利用Windows系统的CREATE_NO_WINDOW(值为0x08000000)进程创建标志,禁止ChromeDriver弹出控制台。
修改后完整代码
import os from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from tkinter import * import multiprocessing as mp # Windows系统进程创建标志:不创建控制台窗口 CREATE_NO_WINDOW = 0x08000000 class Scrub: def __init__(self, master): self.master = master self.submit_btn = Button( self.master, text='Submit', command=self.submit) self.submit_btn.pack() def submit(self): self.t1 = mp.Process(target=execute) self.t1.daemon = True self.t1.start() def execute(): try: urls = ['https://www.google.com/', 'https://www.youtube.com/', 'https://www.instagram.com/', 'https://www.facebook.com/', 'https://www.cnn.com/'] for url in urls: scrape_page(url) except NameError: print('There was an error...') def scrape_page(url): opts = Options() opts.add_argument("headless") chrome_driver = os.getcwd() + "\chromedriver.exe" # 配置Service参数,隐藏控制台窗口 service = Service(executable_path=chrome_driver, creationflags=CREATE_NO_WINDOW) driver = webdriver.Chrome(options=opts, service=service) driver.get(url) driver.quit() if __name__ == '__main__': mp.freeze_support() root = Tk() gui = Scrub(root) root.mainloop()
兼容说明
- 打包仍然使用原有命令即可:
pyinstaller -w -F --onefile TMO_Scrub.pyw - 如果你使用的是Selenium 3.x版本,不支持Service的creationflags参数,可以直接在webdriver初始化时添加参数:
driver = webdriver.Chrome(options=opts, executable_path=chrome_driver, service_creationflags=CREATE_NO_WINDOW)
内容的提问来源于stack exchange,提问作者hyl3rid
相关产品推荐
相关产品推荐

