SWB: Ein einfacher Webbrowser mit Python 3 und pygame
Ein einfacher Webbrowser mit Python 3 und pygame.
Ist nicht mein erster Versuch einen Webbrowser zu schreiben und auch nicht mein letzter. In diesem Fall mit pygame und der Konzentration auf dem Renderer. HTTP sowie das Parsen von HTML und CSS erfolgt mit Python-Modulen von Dritten.
Ende November 2012 hatte ich dazu das Rendern von Floats und HTML-Tabellen bereits ausprobiert. Die ersten Schritte bestehen nun darin, die vor einem halben Jahr geschriebenen Quelltexte aufbereitet zu veröffentlichen.
HTTP-Request - HTML-Quelltext mit print ausgeben
show_html.py
benutzt Requests
zum Senden eines GET-Requests und Ausgabe des HTML-Quelltext plus den
HTTP-Response-Headern wenn --show-response-headers
angegeben ist.
Mit --html-lines 7
wird die Anzahl der ausgegebenen HTML-Zeilen
begrenzt.
Download: Revision 102
svn checkout --revision 102 https://svn.sven-drieling.de/repos/trunk/playground/webbrowser/ yd-playground-webbrowser-102
HTML-Quelltext mit pygame ausgeben
swb_02_pygame_show_html_sourcecode zeigt den HTML-Quelltext im pygame-Window an.
Der Text wird immer komplett, Zeile für Zeile, mit Hilfe von pygame.font.render(line, g.fg, g.bg)
ausgegeben. Negative Positionsangaben im nachfolgenden
pygame.surface.blit(text_surface, (left, top))
sorgen für das Scrolling.
Das Clipping wird pygame überlassen. Weil immer alle Zeilen und nicht nur die sichtbaren ausgegeben werden,
ist bei längeren Texten die Ausgabe entsprechend langsam.
def draw(self, g): g.surface.fill((255, 255, 255)) left = self.left - self.scroll_left top = self.top - self.scroll_top for line in self.text.splitlines(): # Using render() and blit() because render_to() renders sometimes # trash on screen (text_surface, text_size) = g.font.render(line, g.fg, g.bg) g.surface.blit(text_surface, (left, top)) top = top + text_size.height + self.LINE_GAP
Mit den Cursor-, PageUp/Down- und Home/End-Tasten kann der Quelltext gescrollt werden. Dazu wird zuvor die Höhe und Breite des gesamten Textes berechnet.
def layout(self, g): self.text_width = 0 self.text_height = 0 for line in self.text.splitlines(): # Using font.render because freetype.Font.render() and # freetype.Font.get_rect returns different sizes (text_surface, text_size) = g.font.render(line, g.fg, g.bg) self.text_height += text_size.height + self.LINE_GAP self.text_width = max(text_size.width, self.text_width) # remove last LINE_GAP self.text_height -= self.LINE_GAP # scrolling self.page_right = self.text_width - self.width self.page_bottom = self.text_height - self.height self.scroll(0, 0)
Schrift-Download
./tools/setup.sh/
dient zum Download der
DejaVu-Schriften. Entpackt werden sie
nach ./fonts/dejavu-fonts/
.
Download: Revision 111
svn checkout --revision 111 https://svn.sven-drieling.de/repos/trunk/playground/webbrowser/ yd-playground-webbrowser-111