Aprende a visualizar archivos HTML en un elemento de WxPython.

Cómo crear un visor de archivos HTML con WxPython

Aunque claramente hay herramientas más complejas y que se dedican solamente a eso como CEF para ofrecer la visualización de datos HTML en una ventana, muchos frameworks ofrecen la misma característica como tal, no tan potentes pero igual deberían funcionar para las caracteristicas más básicas y comunes.

WxPython no es la excepción pues puedes mostrar HTML como información dentro de una ventana usado la clase Html Window. El proposito de esta clase es el mostrar páginas ricas en contenido (ya sea de un archivo local o desde la web con el protocolo HTTP) en una ventana que interpreta el estándar HTML. La anchura de la ventana es constante dada en el constructor y la altura cambia dinámicamente dependiendo del tamaño de página. El siguiente ejemplo muestra como renderizar HTML puro en una nueva ventana o desde un archivo:

import  wx 
import  wx.html 
  
class MyHtmlFrame(wx.Frame):
    def __init__(self, parent, title): 
        wx.Frame.__init__(
            self, 
            parent, 
            -1, 
            title, 
            size = (600,400)
        )

        # Usar la ventana actual como el visor de HTML
        html = wx.html.HtmlWindow(self) 
    
        if "gtk2" in wx.PlatformInfo: 
            html.SetStandardFonts()
        
        # De manera alternativa puedes renderizar una cadena de HTML directamente con el método SetPage
        # html.SetPage("<h4>Hola Mundo</h4>") 
        # Renderizar un archivo local
        html.LoadPage("C:\\Users\\sdkca\\Desktop\\python-sandbox\\index.html") 

app = wx.App()  
frm = MyHtmlFrame(None, "Visor de HTML sencillo")  
frm.Show()  
app.MainLoop()

Ejemplo completo con un selector de archivos

Con el fin de entender completamente la lógica de renderizar archivos HTML, puedes incrementar la dificultad del ejemplo añadiendo un selector de archivos para escoger un archivo para renderizar:

import os
import wx
import wx.html 

FileFilter =    "Html files (*.html)|*.html|" \
                "All files (*.*)|*.*"

class MyApp(wx.Frame):
    # ----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self,
            None, 
            wx.ID_ANY,
            "Visor de HTML con selector de archivos"
        )

        # Crear un panel dentro de la ventana
        panel = wx.Panel(self, wx.ID_ANY)
        self.currentDirectory = os.getcwd()
 
        # Crear el botón para abrir el seleccionador de archivos y añade el binding de 'onOpenFile'
        openFileDlgBtn = wx.Button(
            panel, 
            label = "Escoge un archivo HTML"
        )
        openFileDlgBtn.Bind(wx.EVT_BUTTON, self.onOpenFile)

        # Colocar el botón en un sizer
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(openFileDlgBtn, 0, wx.ALL|wx.CENTER, 5)
        panel.SetSizer(sizer)
    # ----------------------------------------------------------------------

    """
        Crear y mostrar el selector de archivos
    """
    def onOpenFile(self, event):
        dlg = wx.FileDialog(
            self, 
            message = "Escoge un archivo",
            defaultDir = self.currentDirectory, 
            defaultFile = "",
            wildcard = wildcard,
            style = wx.FD_OPEN | wx.FD_CHANGE_DIR
        )

        ## Si el usuario selecciona un archivo, abrelo en el visor
        if dlg.ShowModal() == wx.ID_OK:
            htmlFilePath = dlg.GetPath()
            
            # Crea una nueva instancia del visor de HTML
            htmlViewerInstance = HtmlViewer(None, htmlFilePath)
            htmlViewerInstance.Show()

        dlg.Destroy()
        
# La clase HtmlViewer espera el directorio completo de un archivo HTML
# para abrirlo en una nueva ventana
class HtmlViewer(wx.Frame):
    def __init__(self, parent, filepath):
        wx.Frame.__init__(
            self, 
            parent, 
            -1, 
            "Visor HTML", 
            size = (800, 600)
        ) 

        # abre una nueva ventana de HtmlWindow que es capaz de renderizar dicho contenido
        html = wx.html.HtmlWindow(self) 
        self.Maximize(True)

        if "gtk2" in wx.PlatformInfo: 
            html.SetStandardFonts() 

        # Cargar el archivo seleccionado en el visor!
        html.LoadPage(filepath)

# Ejecutar el programa
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyApp()
    frame.Show()
    app.MainLoop()

Inicialmente, verás un cuadro con un botón sencillo que permite abrir un selector de archivos para seleccionar un archivo HTML. Una vez seleccionas un archivo, un nuevo cuadro aparecerá con el visor de HTML y el contenido del archivo HTML seleccionado.

Que te diviertas !


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores