Драйвер работает в главном потоке и блокирует matplotlib от рендеринга фигуры в окне.
Вы можете запустить драйвер в отдельном потоке, оставив matplotlib работающим в основном потоке.
Поток браузера может быть реализован так:
from threading import Thread
class Browser(Thread):
def __init__(self, plot):
super().__init__()
self.plot = plot
self.mkt_board = None
def run(self):
self.driver = webdriver.Chrome()
self.driver.get("https://livebetting.sportingbet.com/en/live#/8637814")
homepage = Homepage(self.driver)
mkt_board = homepage.marketboard()
mkt_board.transfer_pulse(self.plot)
Здесь я убедился, что драйвер запущен в потоке, создав его экземпляр методом run
.
Экземпляр Browser
инициализируется с экземпляром Plot
, объявленным как:
class Plot:
def __init__(self):
super().__init__()
style.use('fivethirtyeight')
x, y = [], []
fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
self.fig = fig
self.ax1 = ax1
self.x = x
self.y = y
self.ax1.plot(x, y)
def update(self, x_new, y_new):
self.x.append(x_new)
self.y.append(y_new)
self.ax1.plot(self.x, self.y)
self.fig.canvas.draw_idle()
def run(self):
self.b = Browser(self)
self.b.start()
plt.show()
Кроме того, я использовал шаблон Page Objects , чтобы было легче рассуждать о потоке.
class Page:
def __init__(self, driver):
self.driver = driver
def wait_and_find(self, xpath):
wait = WebDriverWait(self.driver, 50)
wait.until(EC.presence_of_element_located((By.XPATH, xpath)))
return self.driver.find_elements_by_xpath(xpath)[0]
class Homepage(Page):
def scoreboard(self):
xpath = '//*[@id="scoreboard"]/div[2]/div/lbk-scoreboard-common/div/div[1]/a/span'
return self.wait_and_find(xpath)
def marketboard(self):
self.scoreboard().click()
self.stat().click()
return Marketboard(self.driver)
def stat(self):
xpath = '//*[@id="scoreboard"]/div[2]/div/lbk-scoreboard-common/div/div[2]/div/div[1]/div/span[1]'
return self.wait_and_find(xpath)
class Marketboard(Page):
NO_BETS = 'We are sorry but no bets are available for this event.'
def __init__(self, driver):
self.driver = driver
def wait_and_find(self, xpath):
wait = WebDriverWait(self.driver, 50)
wait.until(EC.presence_of_element_located((By.XPATH, xpath)))
return self.driver.find_elements_by_xpath(xpath)[0]
def title(self):
return self.driver.find_elements_by_xpath('//*[@id="scoreboard"]/div[1]/div[2]/span[3]')[0].text
def content(self):
return self.driver.find_elements_by_xpath('//*[@id="event"]/lb-marketboard/div/div/div[1]')[0].text
def pulse(self, plot):
'''Replace with info retrieved from your page'''
while True:
plot.update(random.randint(0, 100), random.randint(0, 100))
time.sleep(2)
Теперь запустите сюжет.
p = Plot()
p.run()