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

Tkinter Python Discussion :

TKinter - Dimensionnement de fenetre & ajustement de la police de caractères


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Points : 7
    Points
    7
    Par défaut TKinter - Dimensionnement de fenetre & ajustement de la police de caractères
    Bonjour à Tous,
    Je suis débutant en programmation. Du genre qui n'y connais rien avant de commencer.

    J'ai effectué une recherche sur l'outil le plus adéquate pour commencer. Voyant que finalement chaque langage avait ses avantages et défauts, je me suis tourné vers Python. Effectivement il semble facile d'accès, en tout cas pour le moment. Et pour ce que je veux en faire, la programmation n'est pas ma profession, je pense que cela devrait me suffire.

    Pour commencer je me suis donc fixer un petit projet personnel après avoir lu, au moins en partie, et effectuer les exercices de bases de plusieurs documentations trouvées sur cet excellent site.

    En quelques mots mon projet est le suivant:
    * J'ai un récepteur GPS qui me fourni un string avec, entre autre, l'heure, via le port série. Un string chaque seconde.
    * je veux afficher, en gros, l'heure UTC et l'heure locale.

    Dans un deuxième temps, je voudrais en plus:
    * afficher quelques paramètres liés aux satellites disponibles et à la qualité du lien série,
    * mettre à jour cycliquement l'heure du PC pour en faire un serveur NTP

    Dans un premier temps je me suis concentré sur l'affichage en réservant des variables pour l'affichage.
    Je me suis attelé à vouloir:
    a/ que la fenêtre principale prenne la totalité de l'écran,
    b/ que la fenêtre principale soit divisée en 3 lignes proportionnelles,
    c/ que les 2 lignes du haut soient divisées en 2 colonnes: la case de gauche l'intitulé (UTC ou LOCAL, suivant la ligne), la case de droite la valeur
    d/ que la police de caractère s'adapte à la taille de la case.
    e/ pour le moment je ne m'occupe pas de la 3eme ligne. se sera celle des options.

    J'arrive à a/, b/ c/ mais le d/ me pose problème. La taille de la police ne s'adapte pas à la taille de la cellule. C'est plutôt l'inverse. Du coup ma disposition d'écran n'est plus bonne.

    début 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
    #fenetre de GUI 1
    from tkinter import *
     
    #création du widget principal
    fenetre_master=Tk()
    fenetre_master.wm_iconbitmap("@icon_SM.xbm")	# Utilise l'icon SM
    fenetre_master.wm_state(newstate="zoomed")	# Affiche la fenetre principale en plein écran
    fenetre_master.title("Temps GPS")	# Donne le titre de la fenêtre
    fenetre_master_hauteur=fenetre_master.winfo_reqheight()
    fenetre_master_largeur=fenetre_master.winfo_reqwidth()
    label_font_1=("Arial", int(fenetre_master_hauteur/5),"bold")
     
    # Création de la fenêtre secondaire désignation "UTC"
    utc=Label(fenetre_master, text=fenetre_master_hauteur)	# intitulé de la ligne
    utc.config(bg="blue",fg="green")
    utc.config(height=1, width=int(fenetre_master_largeur/10))
    utc.config(font=label_font_1, anchor=E)
    utc.grid(row=0, column=0)
     
     
    # Création de la fenêtre secondaire contenu "UTC"
    date_heure_utc=Label(fenetre_master, text="Heure UTC")	# création de la fenetre d'affichage de l'heure utc
    date_heure_utc.config(bg="yellow",fg="blue")
    date_heure_utc.config(height=int(fenetre_master_hauteur/50), width=int(fenetre_master_largeur/10*9))
    date_heure_utc.config(font=label_font_1, anchor=W)
    date_heure_utc.grid(row=0, column=1)
     
    # Création de la fenêtre secondaire "Local"
    local=Label(fenetre_master,bg="green", height=int(fenetre_master_hauteur/10), width=int(fenetre_master_largeur/10), anchor=E, 
    	text="Local")# intitulé de la ligne
    date_heure_local=Label(fenetre_master, bg="red", height=int(fenetre_master_hauteur/10), width=int(fenetre_master_largeur*9/10), 
    	anchor=W, text="Heure locale")	# Création de la fenetre d'affichage de l'heure locale
    local.grid(row=1, column=0)						# Positionnement de l'intitulé sur la ligne 1
    date_heure_local.grid(row=1, column=1)	# positionnement de la fenetre d'entrée sur la ligne 1 et colonne 1
     
    fenetre_master.mainloop()
    Fin code.


    Quelqu'un aurait-il déjà été confronté à ce PB?
    Quelle solution adoptée?

    Merci
    Bien cordialement.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Il faut changer la taille de la police lorsque le widget change de dimension.
    Ecrit en Python, c'est plus long:
    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
    import tkinter as tk
    import tkinter.font as font
     
    ignore = False
     
    def on_configure(event):
        global ignore
        size = button.winfo_width()
        if ignore:
            ignore = False
        else:
            myfont['size'] = str(-int(size*0.6))
            print ('size', size, myfont['size'])
            ignore = True
     
    app = tk.Tk()
    myfont = font.Font(weight='bold', size=10)
     
    button = tk.Button(app, text='abc', font=myfont)
    button.pack(expand='yes', fill='both', side='left')
    button.bind("<Configure>", on_configure)
     
    tk.mainloop()
    Lorsque le widget change de dimension, il génère l'event "<Configure>".
    Le callback "on_configure" récupère le width en pixel et modifie le size de la font (le "-" c'est pour dire "taille en pixel").
    Évidement, un truc pareil va modifier la taille du widget et générer un autre event et çà boucle: c'est ce qu'évite "ignore".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 45
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup pour votre réponse, problème résolut !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    Merci pour cette réponse, mais du coup j'ai 2 questions supplémentaires:
    * La solution proposée est-elle possible sur tous les widgets ou seulement les "button"? le mien est un "label".
    * La solution proposé est-elle en Python 3? j'ai l'impression que c'est dans une version antérieure.

    Merci
    Cordialement.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par Stefyaounde Voir le message
    * La solution proposée est-elle possible sur tous les widgets ou seulement les "button"? le mien est un "label".
    La solution est applicable à tout widget qui accepte "font=...".
    Et comme vous changez la "font" et non l'association, çà doit se propager à tous les widgets associés à...

    Citation Envoyé par Stefyaounde Voir le message
    * La solution proposé est-elle en Python 3? j'ai l'impression que c'est dans une version antérieure.
    En V2, le module s'appelle Tkinter. Ici j'importe "tkinter".
    Mais le plus important est de savoir si vous arrivez à faire fonctionner l'exemple chez vous.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    J'ai écris l'exemple que vous m'avez donné, mais cela ne fonctionne pas. Je pense que c'est un pb autour des appels de Tk...
    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
    #fenetre de GUI 1
    from tkinter import *
    from tkinter import font
     
    tk=Tk()
    ignore=False
    def on_configure(event):
    	global ignore
    	size=fenetre_master_largeur
    	if ignore:
    		ignore=False
    	else:
    		myfont['size']=str(-int(fenetre_master_largeur*0.6))
    		print('size',size, myfont['size'])
    		ignore=True
     
    app = tk.Tk()
    myfont = font.Font(weight='bold', size=10)
     
    button = tk.Button(app, text='abc', font=myfont)
    button.pack(expand='yes', fill='both', side='left')
    button.bind("<Configure>", on_configure)
     
    tk.mainloop()
    j'ai ce message d'erreur:
    Traceback (most recent call last):
    File "C:\Python34\mes tests\horloge gps20140922-2.py", line 17, in <module>
    app = tk.Tk()
    File "c:\python34\lib\tkinter\__init__.py", line 1883, in __getattr__
    return getattr(self.tk, attr)
    AttributeError: 'tkapp' object has no attribute 'Tk'
    [Finished in 0.4s with exit code 1]

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Si j'écris:
    Et que vous le modifiez en:
    Effectivement, çà ne marchera plus pareil...

    Mais peut être faut-il prendre le temps de comprendre ce qui est écrit avant de vouloir le modifier?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Novembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Je me suis effectivement un emballé.
    le code que tu avais fourni fonctionne bien, je vais pouvoir essaye de comprendre pour le réutiliser.
    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
    #fenetre de GUI 1
    import tkinter as tk
    import tkinter.font as font
     
    ignore = False
     
    def on_configure(event):
        global ignore
        size = button.winfo_width()
        if ignore:
            ignore = False
        else:
            myfont['size'] = str(-int(size*0.6))
            print ('size', size, myfont['size'])
            ignore = True
     
    app = tk.Tk()
    myfont = font.Font(weight='bold', size=10)
     
    button = tk.Button(app, text='abc', font=myfont)
    button.pack(expand='yes', fill='both', side='left')
    button.bind("<Configure>", on_configure)
     
    tk.mainloop()
    Mais du coup quelle est la différence entre ces 2 lignes? J'avais compris que from tkinter import * importait toutes les modules et donc commandes disponibles dans TKinter.
    Visiblement, il y a une réelle difference.
    Merci
    Cdlt

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par Stefyaounde Voir le message
    Mais du coup quelle est la différence entre ces 2 lignes? J'avais compris que from tkinter import * importait toutes les modules et donc commandes disponibles dans TKinter.
    Visiblement, il y a une réelle difference.
    "Visiblement", la différence est minime: plutôt qu'écrire: Tk ou Button, il faudra préfixer: tk.Tk(), tk.Button()...
    Pour le reste, ici çà marche pareil.

    Techniquement, c'est plus compliqué.
    Si vous vous posez la question, c'est que vous avez d'autres choses plus importantes à apprendre avant de vous prendre la tête avec ces détails.
    Vous avez plein de discussions à lire ici ou via Google pour vous forger une opinion sur quelle forme utiliser (et quand).
    En attendant, vous pouvez vous contenter de la prescription sortie du PEP8:

    Wildcard imports (from <module> import *) should be avoided, as they make it unclear which names are present in the namespace, confusing both readers and many automated tools. There is one defensible use case for a wildcard import, which is to republish an internal interface as part of a public API (for example, overwriting a pure Python implementation of an interface with the definitions from an optional accelerator module and exactly which definitions will be overwritten isn't known in advance).
    - W
    PS: "should" est moins fort que "shall". Ce n'est donc pas "interdit", juste que vous devez avoir de bonnes raisons pour le faire. Et débuter est une bonne raison.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [LG] Dimensionnement des fenêtres text
    Par retniC dans le forum Langage
    Réponses: 4
    Dernier message: 28/10/2005, 14h30
  2. [Tkinter] fermeture de fenetre
    Par Jipege dans le forum Tkinter
    Réponses: 2
    Dernier message: 27/04/2005, 18h49
  3. [Tkinter] Démarrer une fenetre en plein écran
    Par Kyti dans le forum Tkinter
    Réponses: 1
    Dernier message: 20/04/2005, 19h42
  4. [C#] Probleme de dimensionnement des fenetres en MDI
    Par stephdiplo150 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/05/2004, 20h05

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