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)
你也应该更新标签,而不是每次都创建一个新标签。
我正在尝试用 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)
你也应该更新标签,而不是每次都创建一个新标签。