1

I'm trying to create a tk widget which auto-updates the score of a cricket match. this is my code. But it is not auto-updating. please help me with this.

import requests
from bs4 import BeautifulSoup

from tkinter import *
from tkinter import ttk
import time, threading 

def scrape_cric():
       #this below link can be any link of an ongoing match.
       page = 'http://www.cricbuzz.com/live-cricket-scores/18733/engu19-vs-bdeshu19-5th-place-playoff-semi-final-2-icc-under-19-world-cup-2018' 
       r = requests.get(page)
       soup = BeautifulSoup(r.text, 'lxml')
       score_1 = soup.find('div', {'class':'cb-min-bat-rw'})
       score = soup.find('span', {'class':'cb-font-20 text-bold'})
       return score.text


def display_Score():
       root = Tk()
       top_frame = Frame(root)
       bottom_frame = Frame(root)
       Label1 = Label(top_frame, text = scrape_cric())
       Label1.pack()
       top_frame.pack()
       mainloop()
       threading.Timer(10, display_Score()).start()


 display_Score()

It displays the score once on executing and doesn't auto-update. Once i close the tk widget, it again appears with updated scores. I don't want to close it to. It should update without e closing it.

Pytholic
  • 25
  • 1
  • 7
  • 1
    You can combine these two answers to achieve what you want. Basically, don't re-create every Tk object on each call and use after method instead of threading. https://stackoverflow.com/a/46687436/ && https://stackoverflow.com/a/25753719/ – Lafexlos Jan 28 '18 at 13:32

1 Answers1

1

The cause of this problem is beacuse you create a new root Tk in each call to the function instead of changing the text alone

A fix around that would be:

root = Tk()
top_frame = Frame(root)
label = Label(top_frame)
top_frame.pack()
label.pack()
def update():
    label['text']=scrape_cric()
    threading.Timer(10, update).start() #####
update()
root.mainloop()

Another important note: make sure you set the target of the timer to the function object, instead of calling it inside the creation of your timer

Konrad Borowski
  • 11,584
  • 3
  • 57
  • 71
Johny Vaknin
  • 267
  • 2
  • 3
  • 10