IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Cacher les icônes du bureau - Avis sur le code


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Cacher les icônes du bureau - Avis sur le code
    Bonjour,

    J'ai codé un petit script pour masquer les icônes du bureau Windows, je me demandais ce que vous auriez fait pour le rendre plus joli / performant, si vous avez du temps à perdre... J'ai mis quelques annotations si jamais ce n'était pas clair.

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    import time, threading, random
    import win32gui, win32con, win32api
    import ctypes
    import tkinter as tk
    from PIL import ImageTk, Image, ImageOps
     
    ####PARAMETRES####
    IdleTime = 1000  #msec
     
    ####VARIABLES####
    wallpaper = None
    wallpaper_path = None
    wallpaperized = False
    idle = False
    win_title = str(random.getrandbits(128)) #Nom de fenêtre Tkinter random
     
    def getIdleTime():
        return (win32api.GetTickCount() - win32api.GetLastInputInfo())
     
    # Afficher le bureau quand on clic gauche sur le wallpaper
    def on_click(event):
        global walpaperized, idle
        root.withdraw()
        walpaperized = False
        idle = False
     
    #Met à jour le canvas (si changement de wallpaper)
    def getWallpaper():
        global wallpaper, wallpaper_path
        ubuf = ctypes.create_unicode_buffer(512)
        ctypes.windll.user32.SystemParametersInfoW(win32con.SPI_GETDESKWALLPAPER,len(ubuf),ubuf,0)
        path = ubuf.value
     
        if wallpaper_path != path:
            wallpaper_path = path
            wallpaper = Image.open(path)
            wallpaper = ImageOps.fit(wallpaper, (WIDTH,HEIGHT)) #Redimensionne l'image à la taille de l'écran  
            wallpaper = ImageTk.PhotoImage(wallpaper)           #Transforme l'image pour Tkinter
            canvas.itemconfig(container, image=wallpaper)       #Met à jour le canvas
     
    #Affiche la fenêtre tkinter
    def displayWallpaper():    
        root.deiconify()    
     
    #Retourne False si une fenêtre est ouverte (sauf root et qq programmes windows), une exception est alors soulevée par EnumWindows
    def winEnumHandler( hwnd, ctx ):
        if win32gui.IsWindowVisible( hwnd ) and not win32gui.IsIconic(hwnd):
            title = win32gui.GetWindowText( hwnd )
            for word in ('','Expérience d’entrée Windows','Program Manager','Paramètres','Hôte contextuel',\
                         'Centre de notifications','Calculatrice','Alarmes et horloge',win_title):
                if title == word:
                    return True
            return False
     
    #Fenêtre tkinter
    def mainroot():
        global WIDTH, HEIGHT, root, container, canvas
        root = tk.Tk()
        root.title(win_title)
        WIDTH, HEIGHT = root.winfo_screenwidth(), root.winfo_screenheight()
        root.geometry(f'{WIDTH+4}x{HEIGHT+4}+-2+-2')    
        #root.attributes('-fullscreen',True )
        root.overrideredirect(1)                                                #Mettre la fenêtre par dessus tout
        #root.attributes('-topmost',True )
        canvas = tk.Canvas(root, width = WIDTH, height = HEIGHT)      
        canvas.pack()
        container = canvas.create_image(2,2, anchor=tk.NW)                      #Garder le canvas en mémoire
        root.withdraw()                                                         #Cacher la fenêtre
        root.bind("<ButtonRelease-1>", on_click)                                #"Binder" la fenêtre entière pour la cacher
        root.mainloop()
     
    threading.Thread(target=mainroot).start()
    time.sleep(1)
     
    while True:
        time.sleep(0.1)
        getWallpaper()
        try:
            win32gui.EnumWindows( winEnumHandler, None )
        except:                                                                 #Une fenêtre est ouverte (exceptée celles autorisées)
            wallpaperized = False
            idle = False
        else:                                                                   #Si aucune exception soulevée alors aucune fenêtre n'est ouverte, on est donc sur le bureau grosso-modo
            title = win32gui.GetWindowText(win32gui.GetForegroundWindow())
            if not title:                                                       #On est vraiment sur le bureau
                if not wallpaperized:                                           #On n'a pas déjà affiché le wallpaper (sécurité inutile ?)
                    wallpaperized = True
                    threading.Thread(target=displayWallpaper).start()           #On affiche le wallpaper
     
            if not idle:
                if getIdleTime()>IdleTime :
                    if title not in ('Calculatrice','Alarmes et horloge'):      #Nécessaire pour ne pas afficher le wallpaper par dessus ces deux utilitaires windows
                        idle = True
                        wallpaperized = True
                        threading.Thread(target=displayWallpaper).start()
    Bizarrement quand je mets Tkinter dans le thread principal le comportement du script est différent au niveau de la partie concernant l'idle... En gros ça n'affiche pas le fond d'écran par dessus si la calculatrice n'est pas une fenêtre active mais affichée à l'écran alors qu'avec ce script le fond d'écran recouvre la calculatrice dans ce cas de figure (mais pas si active et c'est ce que je souhaite). J'ai hâte de voir ce que ça va donner quand je vais passer le tout sous pyinstaller...

    PS : C'est joli
    Dernière modification par Invité ; 29/05/2022 à 01h25.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 799
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par LeNarvalo Voir le message
    J'ai codé un petit script pour masquer les icônes du bureau Windows, je me demandais ce que vous auriez fait pour le rendre plus joli / performant, si vous avez du temps à perdre...
    Désolé là tu utilises des outils zindoz que je ne connais pas donc je peux pas t'aider. Mais j'ai vu qq détails...
    Déjà ta boucle titre=truc; for word in (...): if titre=word return True; return False se réduira en un simple return titre in (...).
    Ensuite quand on try/except, c'est bien de dire quoi on except.
    Et enfin perso j'aime bien expliciter les tuples, c.a.d. écrire (x, y)=(..., ...) et non pas x, y=..., ... (explicite vaut mieux qu'implicite).
    Et bien évidemment les if multiples sans alternative peuvent se réduire en un seul "if" unique. if X: if Y: if Z: truc devient if X and Y and Z: truc.
    C'est tout ce que je vois.

    Citation Envoyé par LeNarvalo Voir le message
    J'ai mis quelques annotations si jamais ce n'était pas clair.
    Tu veux dire que ce n'est pas une habitude naturelle de ta part???

    Citation Envoyé par LeNarvalo Voir le message
    C'est joli
    Oui, c'est classe.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut !

    Et merci pour ton retour !!

    Concernant ce bout de code for word in ('','Expérience d’entrée Windows',...): if title == word: return True versus return titre in (...), on m'avait dit qu'utiliser in n'était pas performant, du coup quand je veux grapiller une nanoseconde je m'en passe. Quand penses-tu ?

    Ensuite quand on try/except, c'est bien de dire quoi on except.
    La fonction EnumWindows(...) émet une exception lorsque je lui retourne False ( return titre in (...) ) et du coup ça arrête le parcours des fenêtres, j'espère ainsi gagner quelques msecs.

    Et enfin perso j'aime bien expliciter les tuples, c.a.d. écrire (x, y)=(..., ...) et non pas x, y=..., ... (explicite vaut mieux qu'implicite).
    Ca change qq chose ?

    Et bien évidemment les if multiples sans alternative peuvent se réduire en un seul "if" unique. if X: if Y: if Z: truc devient if X and Y and Z: truc.
    Pareil c'est pour grapiller, une nanoseconde par ci, par là ! Je me dis, peut-être à tord, que dans une condition multiple, python teste toutes les conditions avant de retourner vrai ou faux, non ?

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 799
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Concernant ce bout de code for word in ('','Expérience d’entrée Windows',...): if title == word: return True versus return titre in (...), on m'avait dit qu'utiliser in n'était pas performant, du coup quand je veux grapiller une nanoseconde je m'en passe. Quand penses-tu ?
    En général je pense juste le matin. Mais si ta question était "qu'en penses-tu" là j'en ai aucune idée. Donc dans ce cas, t'as le timeit pour regarder.

    Citation Envoyé par LeNarvalo Voir le message
    La fonction EnumWindows(...) émet une exception lorsque je lui retourne False ( return titre in (...) ) et du coup ça arrête le parcours des fenêtres, j'espère ainsi gagner quelques msecs.
    Oui mais on précise l'exception. Cela donne une programmation propre (si ça excepte un truc prévu c'est bon mais si ça excepte une division par 0 alors mon code plante et je regarde pourquoi je divise par 0). Parce que except sans rien ça te masque toute erreur de programmation.

    Citation Envoyé par LeNarvalo Voir le message
    Ca change qq chose ?
    Absolument rien. C'est la virgule qui fait le tuple, pas les parenthèses. Mais comme parfois les parenthèses sont nécessaires, je les mets tout le temps. Et comme je l'ai dit, c'est recommandé par la PEP

    Citation Envoyé par LeNarvalo Voir le message
    Pareil c'est pour grapiller, une nanoseconde par ci, par là ! Je me dis, peut-être à tord, que dans une condition multiple, python teste toutes les conditions avant de retourner vrai ou faux, non ?
    Ah non, là c'est garanti. Python travaille à l'économie donc si un test est faux, il s'arrête. Tu peux tester avec par exemple un if fctA() and fctB() and fctC() en codant les 3 fonctions pour qu'elles affichent un texte avant de retourner True/False. Si la fctA renvoie False, tu verras que les deux autres ne sont pas appelées.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Invité
    Invité(e)
    Par défaut
    En général je pense juste le matin.
    Génial !

    Oui mais on précise l'exception.
    Ah oui c'est vrai ! Un de mes travers...
    pywintypes.error: (0, 'EnumWindows', 'No error message is available'). Je fais comment pour capter le truc du coup ?

    Ah non, là c'est garanti. Python travaille à l'économie donc si un test est faux, il s'arrête. Tu peux tester avec par exemple un if fctA() and fctB() and fctC() en codant les 3 fonctions pour qu'elles affichent un texte avant de retourner True/False. Si la fctA renvoie False, tu verras que les deux autres ne sont pas appelées.
    Ah pas bête la guêpe ! Effectivement ! Merci ! =)

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 799
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    pywintypes.error: (0, 'EnumWindows', 'No error message is available'). Je fais comment pour capter le truc du coup ?
    Là j'ai pas bien pigé ce que tu as écrit. L'erreur c'est "pywintypes.error" ? Ben tu écris except pywintypes.error...

    Moi quand je ne connais pas l'exception que je dois attendre je mets un code sans exception et je le lance en le mettant en situation d'échec. L'exception remonte alors dans mon terminal et je connais alors son nom.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cacher les icônes du bureau
    Par Invité dans le forum Windows 11
    Réponses: 7
    Dernier message: 03/06/2022, 07h49
  2. Réponses: 4
    Dernier message: 10/06/2014, 20h34
  3. Réponses: 0
    Dernier message: 12/06/2012, 12h07
  4. afficher/cacher les icônes du bureau !
    Par cincap dans le forum Débuter
    Réponses: 4
    Dernier message: 25/08/2011, 09h10

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