tkinter:如何通过 TKinter 中的单独进程正确更新 GUI?

tkinter: How to properly update GUI as a result of separate process in TKinter?

我正在尝试用 TKinter 和 selenium 编写一个 Python 程序,检查互联网连接,如果没有互联网连接,它会转到我的互联网提供商的特定页面并输入我的登录名,然后密码(我需要这个,因为互联网每 30 分钟不活动就会断开一次)。

所以我正在尝试使用 tkinter 同时做多项事情,我目前需要的是一个基于互联网是否每 100 毫秒连接一次来更新 GUI 的功能。这基本上是互联网连接状态的可视化。

import tkinter as tk
import urllib.request

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

DRIVER_PATH = 'C:/chromedriver.exe'
STATE = False
URL = 'URL ADRESS OF LOGIN PAGE OF MY PROVIDER'

def _selenium_driver():
    #your login and password information
    LOGIN = "login"
    PASSWORD = "password"
    
    #option not to open a chrome window, and run
    #the app in background instead
    options = webdriver.ChromeOptions()
    options.add_argument("headless")
    
    #start the Chrome Driver, and access URL
    driver = webdriver.Chrome(options=options,executable_path=DRIVER_PATH)
    driver.get(URL)
    
    #find the appropriate fields by name and fill
    #in with data. Names can be found by inspecting
    #elements by right-clicking the element in chrome
    login = driver.find_element_by_name("loginid")
    login.send_keys(LOGIN)

    pswd = driver.find_element_by_name("password")
    pswd.send_keys(PASSWORD)

    login.send_keys(Keys.RETURN)
    
    driver.quit()

def isInternetOn():
    # tries opening google IP address,
    # returns false if unsuccessful
    try:
        urllib.request.urlopen('http://216.58.192.142', timeout=1)
        return True
    except urllib.request.URLError as err: 
        return False
      
def updateConnectionStatus(tk,root,canvas):
    print('is in updateConnectionStatus')
    
    if isInternetOn():
        label1 = tk.Label(root, text= "Connected")
        canvas.create_window(160, 190, window=label1)
    elif not isInternetOn():
        label1 = tk.Label(root, text= "Reconnecting")
        canvas.create_window(160, 190, window=label1)
    root.after(100,updateConnectionStatus(tk,root,canvas))

root= tk.Tk()

canvas1 = tk.Canvas(root, width = 300, height = 250)
canvas1.pack()

root.mainloop()
root.after(100,updateConnectionStatus(tk,root,canvas1))

这段代码的问题是它只在最后一行输入 'root.after',在我关闭 window 之后,所以基本上在 mainloop 完成之后。我怎样才能让它在后台自动始终检查连接并更新状态?

root.mainloop() 行移至文件底部。

您还需要在倒数第二行和函数中使用正确的调用,如下所示:

root.after(100,updateConnectionStatus, tk,root,canvas1) 

你也应该更新标签,而不是每次都创建一个新标签。