1. #1
    Membre habitué
    Inscrit en
    mai 2008
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 313
    Points : 131
    Points
    131

    Par défaut Webview : Resize window en fonction du contenu

    Hello tout le monde,

    Je suis en train de programmer un petit widget de bureau en python.
    Il s'agit d'un petit widget en Webview qui affiche simplement une image random parmis une liste de site proposant des images du jour.

    Tout cela est géré en javascript qui va reload l'image affichée dans le html.

    Mon soucis: Par défaut, la webview va s'adapter à la taille du contenu, mais dans un seul sens, je m'explique:
    Si la première image affichée est petite (disons 140x140), et qu'on passe à une image plus grande(480x480), pas de soucis, la fenêtre s’agrandit automatiquement en 480x480.
    Cependant dans le cas inverse ça ne fonctionne pas:
    Si on passe d'une grande image (480x480) à une petite (140x140), le widget ne se resize pas, l'image affichée est petite (140x140) mais dans une fenêtre immense (480x480) ayant forcement une couleur de background (pas de transparent possible) :/

    voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    from gi.repository import WebKit, Gtk, Gdk, Gio, GLib
    import signal, os
     
    class MainWin(Gtk.Window):
        def __init__(self):
            Gtk.Window.__init__(self, skip_pager_hint=True, skip_taskbar_hint=True)
     
            self.set_wmclass("sildesktopwidget","sildesktopwidget")
            self.set_type_hint(Gdk.WindowTypeHint.DOCK)
            self.set_size_request(10,10)
     
            self.view = WebKit.WebView()
            self.view.props.settings.props.enable_default_context_menu = True
            self.view.load_uri("file:///path/to/my/file.html")
     
            box = Gtk.VBox(homogeneous=False, spacing=0)
            self.add(box)
            box.pack_start(self.view, expand=True, fill=True, padding=0)
            self.set_decorated(False)
            self.connect("destroy", lambda q: Gtk.main_quit())
     
            self.set_decorated(True)
     
        def changeSignal(self):
            self.set_size_request(10,10)
            self.resize(10,10)
     
        def show_window(self):
            self.show_all()
            self.move(0, 0)
            self.set_size_request(10,10)
            self.resize(10,10)
     
    if __name__ == '__main__':
        MainWin()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()
    J'ai simplifié au maximum, donc c'est normal s'il y a quelques incohérences (quelques fonctionnalités et déclencheurs manquants).
    ce que j'aimerai c'est resizer la fênetre de la webview dans la fonction changeSignal() qui se déclenche (correctement) lors du changement d'image.
    Comme vous pouvez le voir j'ai déjà essayé avec self.resize() et set_size_request() mais sans résultat :/

    le html contient juste une image et le script permettant de changer d'image au clic ou après X minutes

    Merci beaucoup =)

  2. #2
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    décembre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : décembre 2017
    Messages : 2
    Points : 3
    Points
    3

    Par défaut Pas WebKit...

    Je ne pense pas que WebKit soit une bonne idée, en plus c'est plutôt WebKit2 qu'il faut utiliser, ta version est obsolète voir inexistante sur les distribs récentes.

    - Il te faut télécharger l'image avec Soup
    - La redimensionner avec cairo.Surface
    - L'afficher avec Gtk.Image

    Si tu veux des exemples python + GTK, regarde dans mes deux projets:
    https://gitlab.gnome.org/gnumdk/lollypop
    https://gitlab.gnome.org/gnumdk/eolie

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    septembre 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : septembre 2017
    Messages : 26
    Points : 35
    Points
    35

    Par défaut Qui peu le plus, peu le moins

    Bonjour à tous,

    Je prend 5 minutes le temps que le café chauffe pour répondre moi aussi à xxkirastarothxx (mince, je viens de me foulé la langue )

    Une autre solution serais d’exécuter du Javascript (getBoundingClientRect) depuis Gtk.

    Pour ce faire, JSGlobalContextRef est une piste sinon la piste à suivre.

  4. #4
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    décembre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : décembre 2017
    Messages : 2
    Points : 3
    Points
    3

    Par défaut Js non introspectable

    JavaScriptCore n'est pas introspectable et donc non disponible en python.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    septembre 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : septembre 2017
    Messages : 26
    Points : 35
    Points
    35

    Par défaut Pour ma défence

    J'avoue ne pas être callé sur le sujet. "Nez en moins", il semble qu'il y ai des choses qui ont été faite a ce sujet : gir1.2-javascriptcoregtk-3.0. Il y a même des exemples sur la toile : import javascriptcore

    PS: L'avantage avec le WebKit c'est qu'on peut réaliser des effet de slide facilement.

  6. #6
    Membre habitué
    Inscrit en
    mai 2008
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 313
    Points : 131
    Points
    131

    Par défaut

    Citation Envoyé par aeiou Voir le message
    xxkirastarothxx (mince, je viens de me foulé la langue )
    Haha ouais je sais, c'est un pseudo qui a plus d'une dizaine d'années maintenant, mais j'ai la flemme de changer x)
    Sinon j'ai tout essayé avec JS déjà, impossible de redéfinir la taille de la fenêtre.
    D'ailleurs, pour ce qui est d'executer du JS coté python, je vous ai peut-être mal compris, mais de mon coté je n'ai pas trouvé ça très compliqué, en passant directement par la webview:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class WebView(WebKit.WebView):
        def get_html(self):
            self.execute_script('oldtitle=document.title;document.title=document.documentElement.innerHTML;')
            html = self.get_main_frame().get_title()
            self.execute_script('document.title=oldtitle;')
     
            return html
        def change(self):
            self.execute_script('getImage();')
    Mais bon je n'ai pas trouvé de solution de ce coté. j'ai essayé en redimensionnant window, document, la div etc... rien ne fonctionne.


    Sinon, merci cedric.bellegarde, j'aime bien la solution proposée, je n'y avait pas pensé.
    Normalement pas besoin de passer par Soup, mon html utilise déjà une api qui me renvoie directement l'url de l'image à afficher. Du coup avec une petite requête urllib je devrais pouvoir récupérer ça sans problème.
    Après en effet, passer par un rendu Gtk.image plutôt qu'une Webview HTML, je pense que c'est ça qu'il me fallait.

    Merci bien, je vais regarder en ce sens

Discussions similaires

  1. Fonction recherche contenu de windows
    Par boubas53 dans le forum Windows 7
    Réponses: 17
    Dernier message: 31/03/2014, 14h56
  2. Taille de la window en fonction du contenu.
    Par Ldoppea dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 20/07/2009, 19h03
  3. [CSS]auto agrandire un iframe en fonction du contenu
    Par hansaplast dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 09/08/2006, 13h36
  4. [VBA]comptage de lignes en fonction du contenu des cellules
    Par calimero91 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 22/12/2005, 12h38
  5. [DOM] Lecture de XML et décision en fonction du contenu
    Par samios dans le forum XML
    Réponses: 6
    Dernier message: 14/10/2004, 17h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo