gled a écrit 33 commentaires

  • # merci à ceux apportant leur aide aux débutants

    Posté par  . En réponse au message problème message d'erreur python. Évalué à 1.

    C'est fou ça.

    Quelqu'un vient demander un peu d'aide poliment avec un début de script et l'incompréhension d'une erreur, donc un peu de travail derrière, et paf, on lui envoie que des commentaires désobligeants, on le catalogue de suite comme un pov' nul d'étudiant qui sait rien faire, bonjour les préjugés, à croire que tous ceux postant ce genre de commentaires n'ont jamais galéré sur de simples problèmes au tout début de leurs apprentissages en programmation.

    Si vous voulez faire fuir tous ceux débutants en programmation venant demander un petit coup de main, z'êtes sur la bonne voie.

    J'aurais compris ces réactions envers une personne demandant qu'on lui fasse tout son boulot sans avoir fait la moindre chose, mais ici je ne comprends pas.

    Heureusement qu'il y a encore des gens prêt à assister les débutants, merci à eux.

  • # Plusieurs bugs

    Posté par  . En réponse au message Deuxième mouture script multi clock. Évalué à 1.

    La première des choses à revoir, est le relancement de l'application lors des mises à jour des couleurs, non seulement ce n'est pas propre, mais en plus cela provoque des erreurs comme.

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "/usr/local/lib/python3.6/tkinter/init.py", line 1699, in call
    return self.func(*args)
    File "main.py", line 69, in
    label=i, background=i, command=lambda x=i: self.setcolors(x)
    File "main.py", line 102, in setcolors
    os.execv(file, sys.argv)
    PermissionError: [Errno 13] Permission denied

    Il n'est pas bien difficile de mettre à jour en temps réel les couleurs des widgets.
    Puis c'est plus de l'ordre du gadget que de pouvoir changer les couleurs des horloges.
    Ce qui serait intéressant serait que tu génères une couleur en t'appuyant sur le string du timezone, ou alors plus simplement des couleurs aléatoires selon des tons de couleurs prédéfinis.

    • Garde tkinter dans sa boîte, c'est pas bien plus complexe et verbeux d'écrire tk.Menu que Menu, dans le premier cas on sait d'où sort la classe Menu dans le second non, dans ton petit script on ne s'y perd pas, mais dans des scripts plus conséquents, on peut vite s'y perdre et être source de collisions d'identifiants. Importer un ou deux trucs d'un module, cela passe, mais au-delà mieux vaut garder le module importé dans son namespace.

    • Généralement les utilisateurs n'apprécient pas trop les fenêtres qui changent de dimensions, je suis dans ce cas, ce que j'aurais fait à ta place est de créer une fenêtre ou l'on pourrait placer par exemple 4 horloges au maximum (pouvant être pourquoi pas défini via une constante ou un argument facultatif de la classe App pour en mettre plus), le fait de cliquer sur un emplacement vide permettrait d'ajouter une nouvelle horloge, l'ajout d'un petit bouton sur chaque horloge serait suffisant pour les supprimer.

    • Le menu des timezones disponibles est trop long (scroll interminable), il faudrait faire quelque chose de plus élaboré, on choisirait d'abord le continent, puis ensuite le pays/ville, pour cela je te conseille d'utiliser la classe Listbox de tkinter.

    • Il y a des bugs lors des ajouts et suppressions d'horloges (pas pris en compte en temps réel).

    • Je ne comprends pas bien comment fonctionne ton fichier de couleurs, ce que j'aurais fait personnellement est de grouper timezone et couleurs en un unique dictionnaire ou autre structure de données.

    • Les secondes ne variant pas d'une horloge à l'autre, j'aurais pour ma part utilisé une unique variable commune à toutes les horloges afin de garder une synchro parfaite entre les horloges.

    • Les appels en ms étant toujours imprécis, le 1000ms peut très bien être 1002ms effectif, cela varie d'un poste à un autre et en fonction des tâches en cours, ce qui fait qu'au bout d'un long moment il y aura des décalages (même en essayant d'ajuster les ms en se basant sur les microsecondes de datetime, je ne suis pas arrivé à obtenir une synchro aux petits oignons).
      N'est-ce pas d'ailleurs pour cette raison que tu as enlevé les secondes des horloges et que tu fais des appels toutes les 500ms ?
      Je pense que pour obtenir une synchronisation plus élaborée il faudrait utiliser un thread séparé, et ce n'est pas facile à faire.

    • Dans ta classe App, il faudrait répartir ce qui peut l'être dans différentes classes, chargement et enregistrement des timezones, fenêtre de création d'un timezone. Il en va de même pour ta classe Clock, tu pourrais répartir chaque zone d'affichage en d'autres classes (date, timer, timezone).

    • Focalise-toi d'abord sur l'essentiel, les choses comme souhaiter la bonne année, ou changer les couleurs sont d'importances secondaires.

    Bonne continuation !

  • # Un peu d'améliorations

    Posté par  . En réponse au message actualisation automatique le contenu du widget Text dans tkinter. Évalué à 4. Dernière modification le 26 novembre 2018 à 12:17.

    Comme tu es en train de finaliser ton projet avec entrain :) , j'ajoute un commentaire.

    Je ne trouve pas cela être une bonne idée d'avoir plusieurs fichiers pour les monitors, un simple fichier par exemple un csv serait plus adapté, car en l'état si on n'enregistre qu'une seule des deux valeurs, on se retrouvera décalé dans l'affichage et aucun moyen de faire de distinctions, car il y a seulement une date.

    Dans ta fonction affichage_update, tu crées de nouveau widgets, ce qui n'a pas intérêt.

    Pour la mise à jour de l'affichage, tu peux le faire soit avec l'event associé au notebook, soit en temps réel lors de chaque archivage de valeurs.

    Ayant du temps à perdre, voici un exemple fonctionnel (désolé, j'ai modifié l’import *).

    import tkinter as tk
    import tkinter.ttk as ttk
    import csv
    import time
    
    RELEVES_FILE = './save/releves.csv'
    RELEVES_FRAME_NAME = 'releves'
    
    #window
    root = tk.Tk()
    root.geometry('450x350')
    root.title('test')
    
    
    def date():
        return time.strftime('%d/%m/%y', time.localtime())
    
    
    def archiver(entry1, entry2):
        mesures = [None, entry1.get().strip(), entry2.get().strip()]
        if not any(mesures):
            return
        mesures[0] = date()
    
        with open(RELEVES_FILE, 'a', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(mesures)
    
        entry1.delete(0, tk.END)
        entry2.delete(0, tk.END)
    
    
    def affichage_update(notebook, wtext):
        frame_name = notebook.select()
        if not RELEVES_FRAME_NAME in frame_name:
            return
        wtext['state'] = tk.NORMAL
        wtext.delete(0.0, tk.END)
        with open(RELEVES_FILE, 'r', newline='') as f:
            reader = csv.reader(f)
            for row in reader:
                text = f'{row[0]:15}\t {row[1]:10}\t\t {row[2]:10}\n'
                wtext.insert(tk.END, text)
        wtext['state'] = tk.DISABLED
    
    
    container = ttk.Notebook(root,width=450, height=350)
    container.pack(expand=1, fill='both', padx=5, pady=5)
    
    monitoring = tk.Frame(container, bg='powder blue')
    container.add(monitoring, text='monitor data')
    
    releves = tk.Frame(container, bg='powder blue', name=RELEVES_FRAME_NAME)
    container.add(releves,text='releves')
    
    lbf1 = tk.LabelFrame(monitoring, text="Lecture Monitor 1", padx=10, pady=10)
    lbf1.pack(side=tk.LEFT, padx=10, pady=10, anchor=tk.NE)
    
    entry_lbf1 = tk.Entry(lbf1)
    entry_lbf1.pack(pady=5)
    
    lbf2 = tk.LabelFrame(monitoring, text="Lecture Monitor 2", padx=10, pady=10)
    lbf2.pack(side=tk.LEFT, padx=10, pady=10, anchor=tk.NW)
    
    entry_lbf2 = tk.Entry(lbf2)
    entry_lbf2.pack(pady=5)
    
    
    bt_archiver = tk.Button(monitoring,text='Archiver', command=lambda : archiver(entry_lbf1, entry_lbf2))
    bt_archiver.place(x=40,y=120)
    
    
    generalites_top = tk.Frame(releves, bg='powder blue', width=450)
    generalites_top.pack(side=tk.TOP, fill=tk.X)
    
    generalites_bottom = tk.Frame(releves,bg='powder blue')
    generalites_bottom.pack(side=tk.BOTTOM)
    
    head_axe_loc35L = ['Date', 'Monitor 1', 'Monitor 2']
    
    lb_date = tk.Label(generalites_top, text=f'{head_axe_loc35L[0]:15}', bg='powder blue', font=('arial',12,'bold'))
    lb_date.pack(side=tk.LEFT, padx=5, anchor=tk.NW)
    
    lb_monitor1 = tk.Label(generalites_top, text=f'{head_axe_loc35L[1]:10}', bg='powder blue', font=('arial',12,'bold'))
    lb_monitor1.pack(side=tk.LEFT)
    
    lb_monitor2 = tk.Label(generalites_top, text=f'{head_axe_loc35L[2]:10}', bg='powder blue', font=('arial',12,'bold'))
    lb_monitor2.pack(padx=70, side=tk.LEFT)
    
    
    s = tk.Scrollbar(releves)
    T = tk.Text(releves, bg='powder blue', width=450, height=350, font=('arial',14,'bold'), pady=25, state=tk.DISABLED)
    
    s.pack(side=tk.RIGHT, fill=tk.Y)
    T.pack(side=tk.LEFT, fill=tk.Y)
    s.config(command=T.yview)
    T.config(yscrollcommand=s.set)
    
    container.bind('<<NotebookTabChanged>>', lambda evt: affichage_update(container, T))
    
    root.mainloop()

    Pour l'affichage, au lieu d'aller chaque fois relire le fichier, tu pourrais optimiser cela en gardant les valeurs en cache que tu actualiserais à chaque archivage.

  • # Les annotations

    Posté par  . En réponse au journal PyParis 2018, c'était bien!. Évalué à 1.

    Merci pour la partage, je suis incapable de comprendre correctement l'anglais oral, mais les fichiers pdf me suffisent.

    Autant j'utilise de temps en temps les annotations, autant je n'aime guère ce système d'annotations complexes qui rend le code python « moche », de plus cela implique d'importer des modules uniquement pour implémenter ces annotations complexes, parfois même le module root (aucun import de celui-ci dans l'application), alors pour ma part j'en reste aux annotations simples avec les types de bases, et quand le type n'est pas connu dans un module, j'utilise simplement object. En revanche les docstrings de mes classes, méthodes, fonctions renseignent bien à quoi correspondent les paramètres à fournir, sans doute pas suffisant pour les psychos_types_rigides, mais en regard de la philosophie de python, cela l'est bien assez.

    Si déjà tout le monde renseignait correctement les docstrings des applications qu'ils développent, on aura fait un grand pas.

  • [^] # Re: Firefox mon ami, mon amour, tu m'emmerdes

    Posté par  . En réponse à la dépêche Sortie de Firefox 59. Évalué à -1. Dernière modification le 22 mars 2018 à 12:45.

    Voilà, c'est un peu ce que je pense aussi, j'accepte aisément que certains ici apprécient sync, mais j'imagine qu'ici beaucoup bossent dans l'informatique donc sync peut leur apporter un gros plus, mais moi je n'ai pas besoin de ça, la capture d'écran, c'est pareil, oui ça peut éventuellement servir à quelques personnes, mais voilà on impose toutes ces options à tout le monde, et au final ça alourdi de plus en plus Firefox.

    Ce qui serait super, c'est que lors de l'installation, on propose ces options à installer sous formes d'extensions officielles (dispo dans l'installeur), chacun pourrait choisir ce qu'il désire en fonction de ses besoins propres.

  • # Firefox mon ami, mon amour, tu m'emmerdes

    Posté par  . En réponse à la dépêche Sortie de Firefox 59. Évalué à -8.

    Des nouveautés, encore des nouveautés, y en a marre de tous ces trucs qui servent à rien.
    Ce que j'aimerais, c'est qu'ils sortent une version allégée sans toutes ces fioritures qui m'oblige sans cesse à trouver comment désactiver ces trucs dans la configuration, si encore c'est possible.

    Pourquoi cette lubie de toujours vouloir ajouter des trucs au navigateur ? Une option pour prendre un screenshot, mais qu'est-ce que ça vient faire dans un navigateur ? Leur truc sync, je m'en bats les noisettes, je doute que beaucoup de gens utilisent ce truc.

    Firefox est devenu une usine à gaz, quantum, truc machin-chouette ça n'a en rien amélioré les choses, 500mo en ram, zut quoi, même si tout n'est pas utilisé, ce n'est plus possible, comme je n'ai pas trouvé d'alternative qui me convienne, je subis.

    De plus lorsque je compare la 52 et la 58 sur laquelle je suis, la 52 est vraiment beaucoup plus fluide (très fluide), moins gourmande en ressources.

    Toute opération depuis ce truc quantum fait monter illico la charge cpu en flèche, par exemple une grosse sélection de texte d'une page provoque de méchants ralentissements, ce n'était pas le cas avant.

    En plus je déteste la nouvelle façon d'avoir agencé les options de configuration, c'est complètement incohérent, le fait d'avoir inséré des trucs dans la barre d'url, et tellement de choses qui me gonflent au fil des versions.

    Purée que ça m'emm… de cracher sur firefox, mon navigateur adoré, mais je vais de déception en déception, et ça me rend triste de penser à trouver une alternative.

    Navré du titre, référence à une chanson

  • # Cela semble être un bug de firefox

    Posté par  . En réponse au message Interdire à firefox/iceweasel de vérifier les connexions wifi. Évalué à 2.

    Après quelques recherches, Je repasse ici pour signaler que c'est, si j'ai bien compris, un bug de firefox.
    (https://bugzilla.mozilla.org/show_bug.cgi?id=1354245)

    Comme j'utilise la version disponible dans mes paquets, la 52 donc, le bug est encore présent, je pense que je vais abandonner la 52 pour installer la dernière version sur le site de mozilla.

    Merci à vous de m'avoir aiguiller pour trouver pourquoi ce paramètre n'était pas pris en compte.

  • [^] # Re: network.portal-captive-service.enabled

    Posté par  . En réponse au message Interdire à firefox/iceweasel de vérifier les connexions wifi. Évalué à 2. Dernière modification le 10 décembre 2017 à 12:16.

    Merci de vos réponses.

    @ted
    Cela n'a rien à voir avec le javascript des pages que je visite, mais bien du navigateur.
    Et j'ai tout ce qu'il faut en extensions en bloqueur de pub et javascript =)

    @gouttegd
    Malheureusement cela ne fonctionne pas, j'avais déjà désactivé network.portal-captive-service.enabled, mais firefox a toujours continué à vérifier ma connexion.

    Titre de l'image

    J'ai même changé l'url de captivedetect.canonicalURL en mettant une chaine vide ou encore un chenim vers un fichier local (avec "success" dedans) mais pareil, il continue toujours à m'afficher ce bandeau, comme si tous ces paramètres de configuration n'étaient pas pris en compte par firefox.