Feb-03-2022, 04:00 PM
This code doesn't really work on it's own but you have to make an index.html file with the code below the python code.. Without getting out of context, the 3rd Text is behaving weirdly for some reason, expand the 2nd Box and you'll see (by clicking it).
from bs4 import BeautifulSoup import pygame pygame.init() screen = pygame.display.set_mode((720, 1280)) clock = pygame.time.Clock() class series(): def __init__(self, s_name, season_episodes): self.s_name = s_name self.season_episodes = season_episodes total_eps = 0 for x in season_episodes: total_eps += x self.total_eps = total_eps def displayep(self, ep_no): if ep_no < self.total_eps: season = 1 no = 0 ep_now = self.season_episodes[0] ep_array = [self.season_episodes[0]] while ep_no > ep_now: season += 1 no += 1 ep_now += self.season_episodes[no] ep_array.append(ep_now) # print(season) # print(ep_now) epi = ep_no - ep_array[len(ep_array)-2] if epi > 0: return (f"Episode {ep_no} is equivalent to Season {season} Episode {epi}") else: epi = abs(epi) epi = self.season_episodes[0] - epi if epi == 0: epi = 20 return (f"Episode {ep_no} is equivalent to Season {season} Episode {epi}") else: return (f"Episode {ep_no} Doesn't Exist in {self.s_name}") # Bleach = series("Bleach", [20, 21, 22, 28, 18, 22, # 20, 16, 22, 16, 7, 17, 36, 51, 26, 24]) # Bleach.displayep(20) class Box(): def __init__(self, x, y, w, h, main_text, expanded_text): self.x = x self.y = y self.w = w self.h = h self.texth = h self.main_text = main_text self.expanded_text = expanded_text self.expanded = False self.up = False def render(self, col): pygame.draw.rect(screen, col, (offset[0] + self.x, offset[1] + self.y, self.w, self.h), 0, 9) displayText(self.main_text, offset[0] + (self.x + self.x + self.w)//2, offset[1] + (self.y + self.y + self.texth) // 2, 24, (255,255,255)) if self.expanded: displayText(self.expanded_text, offset[0] + (self.x + self.x + self.w)//2, offset[1] + (self.y + self.y + self.h)//2, 20, (255,255,255)) def expand(self, limit): self.expanded = True for self.h in range(self.h, limit, 16): self.render((154, 212, 214)) display_stuff() pygame.display.flip() screen.fill((242, 253, 255)) def retract(self, limit): for self.h in range(self.h, limit, -16): self.render((154,212,214)) display_stuff() pygame.display.flip() screen.fill((242, 253, 255)) self.expanded = False def click(self, mx, my, mb): if is_colliding(mx, my, offset[0] + self.x, offset[1] + self.y, self.w, self.texth) and mb == 1: return True def is_colliding(x, y, x1, y1, w, h): if x >= x1 and y >= y1 and x <= x1 + w and y <= y1 + h: return True def displayText(txt, x, y, font_size=24, color=(0, 0, 0)): font = pygame.font.Font('Fonts/TT Norms Pro Bold.otf', font_size) text = font.render(txt, True, color) textRect = text.get_rect() textRect.center = (x, y) screen.blit(text, textRect) return textRect def display_stuff(): change_y = 60 no = 0 #displayText("Bleach", offset[0] + 150, offset[1] +60, 24, (97, 41, 64)) #displayText("Attack on Titan", offset[0] + 175, offset[1] + 250, 24, (97, 41, 64)) for x in reversed(boxes): x.render(((154, 212, 214))) displayText(season_array[no].s_name, offset[0] + 150, offset[1] + change_y, 24, (97, 41, 64)) change_y += (250 - 60) no += 1 with open("index.html", "r") as f: doc = BeautifulSoup(f, "html.parser") series_name = doc.find_all("h3") no_of_seasons = doc.find_all("h5") season_episodes = doc.find_all("p") offset = [0, 100] # print(series_name) # print(no_of_seasons) # print(season_episodes) no = 0 episodes_array = [] season_array = [] for x in range(len(series_name)): # print(series_name[x].string) s_no = int(no_of_seasons[x].string) for y in range(s_no): seperated_string = season_episodes[no].string.split(":") episodes_array.append(int(seperated_string[1])) no += 1 season_array.append(series(series_name[x].string, episodes_array)) episodes_array = [] WIDTH, HEIGHT = pygame.display.get_window_size() toggle = False ani_height = 100 up = False mb = 0 #boxes = [Box(WIDTH//8, 100, WIDTH - (WIDTH//4), 100, "Episode to Seasons", "IDK"), Box(WIDTH//8, 300, WIDTH - (WIDTH//4), 100, "Episode to Seasons", "Temp")] boxes = [] y_change = 100 for x in season_array: boxes.append( Box(WIDTH//8, y_change, WIDTH - (WIDTH//4), 100, "Episode to Seasons", "IDK") ) y_change += 200 no = 0 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 4: offset[1] += 20 if event.button == 5: offset[1] -= 20 if event.button == 1: mb = 1 if event.type == pygame.MOUSEBUTTONUP: mb = 0 mx, my = pygame.mouse.get_pos() #mb = pygame.mouse.get_pressed() #b1.render((154, 212, 214)) #boxes[0].expanded_text = season_array[0].displayep(120) #b2.render((154, 212, 214)) if offset[1] > 0: offset[1] = 0 #displayText(f"{offset[0]} {offset[1]}", 100, 100) for box in boxes: box.expanded_text = season_array[no].displayep(128) if box.click(mx, my, mb): if not box.up: box.expand(350) box.up = not box.up else: box.retract(100) box.up = not box.up no += 1 no = 0 #clickableBox(mx, my, WIDTH//8, HEIGHT//5, WIDTH - (WIDTH//4), 100, (154, 212, 214)) """ if toggle: if not up: ani_height += 25 else: ani_height -= 25 if ani_height >= WIDTH//3: ani_height = WIDTH//3 if ani_height <= 100: ani_height = 100 clickableBox(mx, my, WIDTH//8, HEIGHT//5, WIDTH - (WIDTH//4), ani_height, (154, 212, 214)) txt = season_array[0].displayep(120) displayText(txt, WIDTH//2, HEIGHT//2, 24, (255,255,255)) """ display_stuff() pygame.display.flip() screen.fill((242, 253, 255)) clock.tick(60)
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <title>WebScraping</title> <meta name='viewport' content='width=device-width, initial-scale=1'> <link rel='stylesheet' type='text/css' media='screen' href='main.css'> <script src='main.js'></script> </head> <body> <h1>This is a pretty cool heading, isn't it?</h1> <h3>Bleach</h3> <h5>16</h5> <p>1:20</p> <p>2:21</p> <p>3:22</p> <p>4:28</p> <p>5:18</p> <p>6:22</p> <p>7:20</p> <p>8:16</p> <p>9:22</p> <p>10:16</p> <p>11:7</p> <p>12:17</p> <p>13:36</p> <p>14:51</p> <p>15:26</p> <p>16:24</p> <h3>Attack on Titan</h3> <h5>4</h5> <p>1:25</p> <p>2:12</p> <p>3:24</p> <p>4:32</p> <h3>Demon Slayer</h3> <h5>2</h5> <p>1:25</p> <p>2:25</p> </body> </html>