У меня проблема с tkinter mainloop внутри цикла while

#python #tkinter

#python #tkinter

Вопрос:

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from tkinter import *
while True:
    
    selain = webdriver.Chrome()
    selain.get("https://m.kellonaika.fi")
    kello = selain.find_element_by_id("clock-time")
    selain.get("https://www.foreca.fi/Finland/Salo")
    sää = selain.find_element_by_class_name("l")
    sää1 = selain.find_element_by_class_name("r")
    print(sää.text)
    print(sää1.text)
    root = Tk()
    myLabel1 = Label(root, text="sää salossa nyt")
    myLabel3 = Label(root, text=sää.text)
    myLabel4 = Label(root, text=sää1.text)
    myLabel1.grid(row=0, column=2)
 
    myLabel3.grid(row=2, column=1)
    myLabel4.grid(row=3, column=1)

    selain.close()
    time.sleep(10)
    root.mainloop() 
  

цикл while работает, если я закрываю Tkinter окно. Что я могу сделать root.mainloop ?

Комментарии:

1. Это просто заморозит ваш графический интерфейс на 10 секунд, прежде чем показывать ваш графический интерфейс

Ответ №1:

Вы хотите отобразить погоду в Хельсинки-Финляндия через www.foreca.com , но это плохой подход, вы просто замораживаете свое приложение на 10 секунд в каждом цикле.

 time.sleep(10)  # freeze for 10 secs
  

Устраните цикл while и используйте root.mainloop() вместо него, тогда ваше приложение останется запущенным, пока пользователь не закроет приложение, нажав на xкнопку.

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from tkinter import *

selain = webdriver.Chrome()
selain.get("https://m.kellonaika.fi")
kello = selain.find_element_by_id("clock-time")
selain.get("https://www.foreca.fi/Finland/Salo")
sää = selain.find_element_by_class_name("l")
sää1 = selain.find_element_by_class_name("r")
print(sää.text)
print(sää1.text)
root = Tk()
myLabel1 = Label(root, text="sää salossa nyt")
myLabel3 = Label(root, text=sää.text)
myLabel4 = Label(root, text=sää1.text)
myLabel1.grid(row=0, column=2)

myLabel3.grid(row=2, column=1)
myLabel4.grid(row=3, column=1)

selain.close()
root.mainloop()
  

Но вы должны использовать потоковую обработку для обновления формы Tkinter, чтобы постоянно обновлять и обновлять данные. Нравится:

 # run the while loop in a thread
Thread(target=refresh_data, daemon=True).start()
  

Какая refresh_data() функция

Ответ №2:

Вы должны переместить код tkinter из цикла while и запустить цикл while в потоке:

 from selenium import webdriver
#from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time
from tkinter import *
from threading import Thread

root = Tk()

# labels for the result
myLabel1 = Label(root, text="sää salossa nyt")
myLabel3 = Label(root, justify='left')
myLabel4 = Label(root, justify='left')

myLabel1.grid(row=0, column=0)
myLabel3.grid(row=2, column=1, sticky='w')
myLabel4.grid(row=3, column=1, sticky='w')

def get_data():
    # using headless mode
    options = Options()
    options.add_argument("--headless")
    selain = webdriver.Chrome(options=options)
    while True:
        selain.get("https://m.kellonaika.fi")
        #kello = selain.find_element_by_id("clock-time")
        selain.get("https://www.foreca.fi/Finland/Salo")
        sää = selain.find_element_by_class_name("l")
        sää1 = selain.find_element_by_class_name("r")
        # show the result
        myLabel3.config(text=sää.text)
        myLabel4.config(text=sää1.text)
        print(sää.text)
        print(sää1.text)
        time.sleep(10)
    selain.close()

# run the while loop in a thread
Thread(target=get_data, daemon=True).start()

root.mainloop() 
  

Комментарии:

1. Что daemon=True означает / делает?

2. @CoolCloud Смотрите Официальный документ .