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 :

Centrer Widget Text & Coller scrollbar


Sujet :

Tkinter Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut Centrer Widget Text & Coller scrollbar
    Bonjour tout le monde.

    Je débute en Python et j'ai quelques soucis avec le Widget Text de Tkinter.

    1. J'aimerais que le texte à l'intérieur du widget soit centré. J'ai compris qu'il fallait utiliser des tags pour appliquer ce paramètre, mais j'ai beau lire des tutoriels sur le net je ne comprends pas pourquoi mon code ne fonctionne pas.

    2. J'aimerais que le scrollbar vertical soit "collé/attaché" à mon widget Text. Mais j'ai beau appliquer différents paramètres column je n'y parviens pas.

    Voilà mon bout de code qui concerne le widget Text :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     import Tkinter as tk
    .
    .
    .
     
    self.scrollresults = tk.Scrollbar(self, orient=tk.VERTICAL)
    self.results = tk.Text(self,  width=70, wrap=tk.WORD, yscrollcommand=self.scrollresults.set)
    self.results.grid(row=8, column=0, columnspan=4, sticky=tk.N+tk.S)
    self.scrollresults.grid(row=8, column=3, sticky=tk.N+tk.S+tk.E)
    self.scrollresults.config(command=self.results.yview)
    self.results.tag_add('entier','1.0',tk.END)
    self.results.tag_config('entier', justify=tk.CENTER)
    Merci beaucoup de votre aide.

  2. #2
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Tu peut utilser l'option in_=self.results dans tous les directeurs de géométrie(pack(), place() et grid()) pour que ta Scrollbar soit a l'intérieur de ton wifget Text().
    Et il est toujours utile de se référer a help():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    from Tkinter import *
    a=Tk()
    b=Text(a)
    c=Scrollbar(a)
    help(b)
    help(c)
    Concernant le placement centrer si t'est dimension de widget Text() sont fixe c'est facile de jouer sur les index et le taille du text a insérer en fonction de la longueur du texte a insérer:
    en pseudo-code sa donne: Text.insert(('0.'+str(width-len(text_a_insérer))%2), text_a_insérer)#'jutilise % au cas ou la division par 2 ne donne pas un chiffre pair
    Mais fait très attention a la technique d'insertion insert(END, 'text_a_inserér') ou insert('0.0', 'text_a_insérer\n') ne crérons pas les meme indices car au le saut de ligne change de ligne donc l'index suivant sera '1.0' alors que avec END les indices seront 1.0, 1.10, 1.100, 1.1000 etc... mais je te laisse découvrir le syteme métrique des indexes du widget Text().

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut ..
    Merci de m'avoir répondu !

    J'ai essayé de comprendre comment utiliser l'option in_=self.results. Par contre le résultat n'est pas celui que j'attendais.. Et je ne vois pas ce qui cloche. Le widget Text est "comprimé" malgré la précision sur sa taille width=70.

    Et pour centrer mon texte dans mon widget Text, j'avais déjà essayé la méthode en calculant à chaque fois la position mais cela ne fonctionne pas, cela me donne des erreurs d'index.
    Et je ne comprends pas trop les index justement dans le widget Text.

  4. #4
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Tu m'as donner une idée pour résoudre ton pb de Scrollbar: Si il fait width=70 alors pourquoi pas Text.grid(row=8, column=0, columnspan=70) et Scrollbar(row=8, column=70).
    Pour le centrage grace aux index explications supplémentaires: si tu utilise des '\n' pour l'insertion les index seront 1.1->1.9-> 1.10->1.70 (en faite de 1.0 a 1.70) sur la ligne 1 puis 2.1->2.9->2.10->2.70 (en faite de 2.0 a 2.70) sur la ligne 2 car 70 de largeur (sous réserve que le '\n' ne tronque pas la taille de la largeur) et si tu n'utilise pas de '\n' pour l'insertion les index seront 1.0->1.70->1.140>1.210>2.280 etc...
    Et toutes mes escuses pour l'erreur dans mon pseudo code: Text.insert(('0.'+str(width-len(text_a_insérer))%2) qui doit etre remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Text.insert('0.'+str(divmod(70-len(text_a_insérer),2)[0]))
    Text.insert('0.69', '\n')
    Text.insert('1.'+str(divmod(70-len(text_a_insérer),2)[0]))
    Text.insert('1.69', '\n')
    #etc...
    Perso le widget Text() est mon préférer car il présente l'avantage de fonctionner pas seulement en lignes mais aussi en colonnes.
    PS: Je préfere la doc pure (complète) que les tuts... rdv a: http://ftp-developpez.com/michel-aub...on/tkinter.pdf

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut :-)
    En fait mon width=70, j'ai mis 70 parce que le rendu était le meilleur. Mais pourquoi créer 70 colonnes ??? je ne vois pas trop l'intérêt ! Mon interface présente 4 colonnes. Donc je ne vois pas l'intérêt d'en créer 70.

    Pour l'insertion de mes lignes dans mon widget Text, je le fais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for y in range (0, len(ficheresultats),1) :
    	self.results.insert(tk.END, ficheresultats[y])
    J'ai créé une "fiche" de résultats qui est une liste (ficheresultats) contenant toutes mes Strings. Et donc après il ne me reste plus qu'à insérer chaque String (qui se terminent par un "\n") dans mon widget Text results grâce à la ligne de code ci-dessus.

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par phoenix420 Voir le message
    En fait mon width=70, j'ai mis 70 parce que le rendu était le meilleur. Mais pourquoi créer 70 colonnes ??? je ne vois pas trop l'intérêt ! Mon interface présente 4 colonnes. Donc je ne vois pas l'intérêt d'en créer 70.
    Voici qui risque d'être compris de travers.
    width c'est pour la taille du Widget, cela n'as rien à voir avec le nombre de caractères (colonnes pour vous ?) et donc l'index.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import Tkinter as Tk
     
    root=Tk.Tk()
    t=Tk.Text(root, width=4, height=5)
    t.pack()
    t.insert(Tk.END, '123456789')
    print t.index(Tk.END)
    root.mainloop()
    2.0
    @+

  7. #7
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Tu as dit:
    J'aimerais que le texte à l'intérieur du widget soit centré.
    alors je t'ai donner maladroitement la formule pour insérer ton texte au milieux de tes 70 colonnes qui sont qui définissent aussi la taille, soit dit en passant a pause kawa, du wiget Text() an applicant ma formule tu obtiendrai un widget Text() :
    |--------------------------------------------------------- |
    |-------------------------ton---------------------------- |
    |------------------------texte---------------------------|
    |-------------------------est-----------------------------|
    |-----------------------centrer-------------------------|
    |--------------------------------------------------------- |
    Envoyé par phoenix420 Voir le message
    En fait mon width=70, j'ai mis 70 parce que le rendu était le meilleur. Mais pourquoi créer 70 colonnes ??? je ne vois pas trop l'intérêt ! Mon interface présente 4 colonnes. Donc je ne vois pas l'intérêt d'en créer 70.
    Aussi si tu avait seulement lu un peu les help vers lesquelles je t'ai rediriger tu aurai eu comme première informations les options et méthodes complètes des trois différents directeurs de géométrie.
    Définir 70 colonnes pour un widget TEXT() de largeur 70 n'est pas faute si tu souhaite coller une Scrollbar au bord de ce widget tu n'as cas lui donner la colonne 70 c'est logique on part de zéro 0+69=70(widget Text)+1(Scrolbar) sinon utilise une division de 70 si tu as d'autres widgets.

    Je t'avoue que j'ai étais récement confronter au problème d'insertion de scrollbar dans un widget Text et je m'en suis sortie tous seul grace a la fonction help... extrait:
    Methods inherited from Pack:
    |
    | forget = pack_forget(self)
    | Unmap this widget and do not use it for the packing order.
    |
    | info = pack_info(self)
    | Return information about the packing options
    | for this widget.
    |
    | pack = pack_configure(self, cnf={}, **kw)
    | Pack a widget in the parent widget. Use as options:
    | after=widget - pack it after you have packed widget
    | anchor=NSEW (or subset) - position widget according to
    | given direction
    | before=widget - pack it before you will pack widget
    | expand=bool - expand widget if parent size grows
    | fill=NONE or X or Y or BOTH - fill widget if widget grows
    | in=master - use master to contain this widget
    | in_=master - see 'in' option description
    | ipadx=amount - add internal padding in x direction
    | ipady=amount - add internal padding in y direction
    | padx=amount - add padding in x direction
    | pady=amount - add padding in y direction
    | side=TOP or BOTTOM or LEFT or RIGHT - where to add this widget.
    |
    | pack_configure(self, cnf={}, **kw)
    | Pack a widget in the parent widget. Use as options:
    | after=widget - pack it after you have packed widget
    | anchor=NSEW (or subset) - position widget according to
    | given direction
    | before=widget - pack it before you will pack widget
    | expand=bool - expand widget if parent size grows
    | fill=NONE or X or Y or BOTH - fill widget if widget grows
    | in=master - use master to contain this widget
    | in_=master - see 'in' option description
    | ipadx=amount - add internal padding in x direction
    | ipady=amount - add internal padding in y direction
    | padx=amount - add padding in x direction
    | pady=amount - add padding in y direction
    | side=TOP or BOTTOM or LEFT or RIGHT - where to add this widget.
    |
    | pack_forget(self)
    | Unmap this widget and do not use it for the packing order.
    |
    | pack_info(self)
    | Return information about the packing options
    | for this widget.
    |
    | ----------------------------------------------------------------------
    | Methods inherited from Place:
    |
    | place = place_configure(self, cnf={}, **kw)
    | Place a widget in the parent widget. Use as options:
    | in=master - master relative to which the widget is placed
    | in_=master - see 'in' option description
    | x=amount - locate anchor of this widget at position x of master
    | y=amount - locate anchor of this widget at position y of master
    | relx=amount - locate anchor of this widget between 0.0 and 1.0
    | relative to width of master (1.0 is right edge)
    | rely=amount - locate anchor of this widget between 0.0 and 1.0
    | relative to height of master (1.0 is bottom edge)
    | anchor=NSEW (or subset) - position anchor according to given direction
    | width=amount - width of this widget in pixel
    | height=amount - height of this widget in pixel
    | relwidth=amount - width of this widget between 0.0 and 1.0
    | relative to width of master (1.0 is the same width
    | as the master)
    | relheight=amount - height of this widget between 0.0 and 1.0
    | relative to height of master (1.0 is the same
    | height as the master)
    | bordermode="inside" or "outside" - whether to take border width of
    | master widget into account
    |
    | place_configure(self, cnf={}, **kw)
    | Place a widget in the parent widget. Use as options:
    | in=master - master relative to which the widget is placed
    | in_=master - see 'in' option description
    | x=amount - locate anchor of this widget at position x of master
    | y=amount - locate anchor of this widget at position y of master
    | relx=amount - locate anchor of this widget between 0.0 and 1.0
    | relative to width of master (1.0 is right edge)
    | rely=amount - locate anchor of this widget between 0.0 and 1.0
    | relative to height of master (1.0 is bottom edge)
    | anchor=NSEW (or subset) - position anchor according to given direction
    | width=amount - width of this widget in pixel
    | height=amount - height of this widget in pixel
    | relwidth=amount - width of this widget between 0.0 and 1.0
    | relative to width of master (1.0 is the same width
    | as the master)
    | relheight=amount - height of this widget between 0.0 and 1.0
    | relative to height of master (1.0 is the same
    | height as the master)
    | bordermode="inside" or "outside" - whether to take border width of
    | master widget into account
    |
    | place_forget(self)
    | Unmap this widget.
    |
    | place_info(self)
    | Return information about the placing options
    | for this widget.
    |
    | ----------------------------------------------------------------------
    | Methods inherited from Grid:
    |
    | grid = grid_configure(self, cnf={}, **kw)
    | Position a widget in the parent widget in a grid. Use as options:
    | column=number - use cell identified with given column (starting with 0)
    | columnspan=number - this widget will span several columns
    | in=master - use master to contain this widget
    | in_=master - see 'in' option description
    | ipadx=amount - add internal padding in x direction
    | ipady=amount - add internal padding in y direction
    | padx=amount - add padding in x direction
    | pady=amount - add padding in y direction
    | row=number - use cell identified with given row (starting with 0)
    | rowspan=number - this widget will span several rows
    | sticky=NSEW - if cell is larger on which sides will this
    | widget stick to the cell boundary
    |
    | grid_configure(self, cnf={}, **kw)
    | Position a widget in the parent widget in a grid. Use as options:
    | column=number - use cell identified with given column (starting with 0)
    | columnspan=number - this widget will span several columns
    | in=master - use master to contain this widget
    | in_=master - see 'in' option description
    | ipadx=amount - add internal padding in x direction
    | ipady=amount - add internal padding in y direction
    | padx=amount - add padding in x direction
    | pady=amount - add padding in y direction
    | row=number - use cell identified with given row (starting with 0)
    | rowspan=number - this widget will span several rows
    | sticky=NSEW - if cell is larger on which sides will this
    | widget stick to the cell boundary
    |
    | grid_forget(self)
    | Unmap this widget.
    |
    | grid_info(self)
    | Return information about the options
    | for positioning this widget in a grid.
    |
    | grid_remove(self)
    | Unmap this widget but remember the grid options.
    |
    | location = grid_location(self, x, y)
    | Return a tuple of column and row which identify the cell
    | at which the pixel at position X and Y inside the master
    | widget is located.
    PS: Un bon conseil li le document que je t'ai mis dans le lien, ça t'aidera.

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut
    Voici qui risque d'être compris de travers.
    width c'est pour la taille du Widget, cela n'as rien à voir avec le nombre de caractères (colonnes pour vous ?) et donc l'index.
    Oui j'avais bien compris justement que width est utilisé pour fixer la taille du widget, et pas le nombre de colonnes ou autre chose. Voilà pourquoi je ne vois pas l'utilité de créer 70 colonnes alors que mon interface a besoin de 4 colonnes.
    J'ai l'impression que ce que je fais c'est le même principe. J'ai 4 colonnes. Je crée mon widget Text sur les 4 colonnes (column=0, columnspan=4) puis je mets mon scrollbar vertical en colonne 4 (column=4).
    Pourquoi alors mon scrollbar ne se met-il pas en 4ème colonne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    self.scrollresults = tk.Scrollbar(self, orient=tk.VERTICAL)
    self.results = tk.Text(self,  width=70, wrap=tk.WORD, yscrollcommand=self.scrollresults.set, state=tk.DISABLED)
    self.results.grid(row=8, column=0, columnspan=4, sticky=tk.N+tk.S)
    self.scrollresults.grid(row=8, column=3, sticky=tk.N+tk.S+tk.E) 
    self.scrollresults.config(command=self.results.yview)
    Concernant help, je l'ai utilisé. J'ai essayé de trouver ce qu'il me faut dedans mais désolé si je n'ai rien trouvé qui me parlait. Pour l'option "in" j'ai bien vu le paragraphe qui s'y réfère mais pas moyen d'accéder ensuite aux infos sur cette option et de comprendre pourquoi quand je l'utilise mon widget Text est ratatiné..

    | in_=master - see 'in' option description

    Je passe mes journées sur mon application donc désolé si je vous donne l'impression de ne pas chercher à droite à gauche, mais pourtant je le fais.
    Dans le PDF que vous m'avez passé (merci d'ailleurs, il est assez complet), j'ai bien vu la partie qui évoque les scrollbar, et j'ai les mêmes lignes de code, non ?

  9. #9
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par phoenix420 Voir le message
    J'ai l'impression que ce que je fais c'est le même principe. J'ai 4 colonnes. Je crée mon widget Text sur les 4 colonnes (column=0, columnspan=4) puis je mets mon scrollbar vertical en colonne 4 (column=4).
    Pourquoi alors mon scrollbar ne se met-il pas en 4ème colonne ?
    Peut être car elle est positionnée dans la troisième et recouverte par sel.results...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.results.grid(row=8, column=0, columnspan=4, sticky=tk.N+tk.S)
    self.scrollresults.grid(row=8, column=3, sticky=tk.N+tk.S+tk.E) 
    self.scrollresults.config(command=self.results.yview)
    column=5 me semble plus juste.

    @+

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.results.grid(row=8, column=0, columnspan=4, sticky=tk.N+tk.S)
    self.scrollresults.grid(row=8, column=3, sticky=tk.N+tk.S+tk.E) 
    self.scrollresults.config(command=self.results.yview)
    Pardon je parlais de colonne 4 mais ce n'est pas ça.
    J'ai 4 colonnes numérotées 0,1,2 et 3. Certains widgets s'étendent sur les 4 colonnes (columnspan=4).

    Là mon scrollbar je l'ai mis dans la colonne 3, et mon widget Text je l'ai mis à la colonne 0 et étendu sur les 4 colonnes. Mon problème n'est pas que mon Text masque mon scrollbar, c'est qu'il y a un espace entre mon Text et mon scrollbar. Alors que je ne vois pas de raisons, mon scrollbar devrait être collé à mon Text.

  11. #11
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    A mon humble avis il faut jouer sur le nombre de colonnes (essayer de convertir ta configuration géométrique d'interface graphique) en mettre plus car si ton application contient d'autres widget sa peut fausser le fait que la 4 ieme colonne soit positionner a coté de ton widget Text, car programmer consiste a faire comprendre a l'ordinateur ce que l'on désire lui faire faire et il y a parfois mépris.

    Plus précisément je te conseille de multiplier toutes les colonnes de ta configuration de directeur de géométrie par 2 voire 3 puis d'appliquer columnspan comme il faut a tous les widgets (sa devrai revenir au meme résultat) sauf a ton widget Text a qui tu applique columnspan multiplier moins une colonne puis d'attribuer la colonne manquante a ton Scrollbar.

    Parfois il faut savoir remanier son oeuvre si tu ajoute des composant non prévus mais la meilleurs solution consiste toujours a tous prévoir, savoir combien de composants va contenir ton interface graphique, avant de construire de contruire celle-çi et prendre tous les paramètres en compte ou meme la contruire avant ton programme mais sa c'est un autre sujet.
    le hasard ne souris qu'au gens préparer (voltaire).

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut
    D'accord :-) je vais donc essayer de multiplier mon nombre de colonnes par 2 ou 3 et voir si le résultat est plus satisfaisant.

    Belle citation en tout cas

  13. #13
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut
    Bonjour.

    J'ai essayé de mettre 14 colonnes par exemple, et le résultat est le même.

    MAIS je crois avoir compris pourquoi. J'ai beau créer par exemple 14 colonnes (de 0 à 13), mettre mon Text widget sur la colonne 0 et l'étendre sur 13 colonnnes, puis mettre mon scrollbar sur la colonne 13 (i.e. la 14ème), il y a un espace entre mon widget Text et mon scrollbar.
    Je pense que c'est dû au fait que mon scrollbar ne remplit pas les colonnes sur lesquelles il est centré. Il a des dimensions fixes et il ne prend pas toute la place qui lui est donnée ! Donc mon scrollbar est dans la bonne colonne mais il y a forcément un espace entre lui et mon widget Text.

    Ce qui m'amène donc à une question : comment étendre les dimensions de mon widget Text pour qu'il remplisse toutes les colonnes qui lui sont données ?

    Ensuite il ne me restera plus qu'à trouver comment centrer mon texte à l'intérieur (avec ou sans tag) et mon appli sera terminée !

  14. #14
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut
    Ca y est j'ai enfin réussi à coller mon scrollbar à mon widget Text (ainsi qu'à une Listbox sur le même principe) grâce à vos précieux conseils !

    Merci !

  15. #15
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Comment ta procéder alors pour coller ta Scrollbar ?
    Pour l'agrandir il faut configurer l'option width qui qu'elle soit verticale ou horizontale définis sa taille. ou sinon passer par le directeur de géométrie gird() en étendant le widget sur tous l'espace définis en mettant grid(sticky=EW).
    Pour la taille du widget Text() je tiens a rappeler que l'option width définis le nombre de caractères(colonnes) et par la meme occasion sa largeur car un "i" occupe la meme place qu'un "M" dans un widget Text ce qui n'est pas le cas de tous les widgets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    from Tkinter import *
    a=Tk()
    b=Text(a, width=40)
    b.pack()
    a.mainloop()
    #c=copier coller d'une ligne remplie du widget Text
    c='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
    len(c)
    40
    Si tu passe tes journées dans les pdf je peut t'aider:

    Des liens vers de la doc sur Tkinter pour t'aider a avancer dans la composition d'interface graphique:

    En francais:
    http://www.ferg.org/thinking_in_tkin...n_tkinter.html
    http://www.freenetpages.co.uk/hp/alan.gauld/tutgui.htm
    http://python.developpez.com/cours/T...e=Chapitre8#L8
    FAQ:http://python.developpez.com/faq/?page=Tkinter

    En anglais:
    http://infohost.nmt.edu/tcc/help/pubs/tkinter/
    http://effbot.org/tkinterbook/
    http://www.pythonware.com/library/tk...tion/index.htm
    http://www.tkdocs.com/tutorial/

    Et puis un qu'il faut pas louper: la doc officiel de python.

    Si tu est en 2.6:
    http://docs.python.org/release/2.6.5/download.html


    Si tu est en Python 3:
    la doc officiel de Python 3.0.1: http://docs.python.org/release/3.0.1/download.html
    la doc officiel de Python 3.1.2: http://docs.python.org/release/3.1.2/download.html

  16. #16
    Membre confirmé
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Par défaut
    En fait j'ai utilisé votre méthode pour que mon scrollbar soit collé à mon widget Text. J'ai éliminé l'écart entre les 2 composants en utilisant l'option "sticky" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    self.scrollresults = tk.Scrollbar(self, orient=tk.VERTICAL)
    self.results = tk.Text(self,  width=74, height= 20, wrap=tk.WORD, yscrollcommand=self.scrollresults.set, state=tk.DISABLED)
    self.scrollresults.grid(row=8, column=10, sticky=tk.N+tk.S+tk.W)
    self.results.grid(row=8, column=4, columnspan=6, sticky=tk.N+tk.S)
    self.scrollresults.config(command=self.results.yview)
    Merci beaucoup pour toutes les références !!
    Je vais essayer de trouver ce qu'il me faut pour comprendre comment centrer une partie de mon texte dans mon widget Text.

  17. #17
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Oula...

    Citation Envoyé par Luke spywoker Voir le message
    Pour l'agrandir il faut configurer l'option width qui qu'elle soit verticale ou horizontale définis sa taille. ou sinon passer par le directeur de géométrie gird() en étendant le widget sur tous l'espace définis en mettant grid(sticky=EW).
    Pour la taille du widget Text() je tiens a rappeler que l'option width définis le nombre de caractères(colonnes) et par la meme occasion sa largeur car un "i" occupe la meme place qu'un "M" dans un widget Text ce qui n'est pas le cas de tous les widgets.
    1) Pour la taille verticale du Widget c'est height, comme pour tous les autres.

    2) C'est le boulot du geometry manager en effet d'étendre le Widget par rapport à la fenêtre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from Tkinter import *
    a=Tk()
    b=Text(a, width=9, height=10)
    b.pack(expand=1, fill=BOTH)
    c='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
    print(len(c))
    b.insert(END, c)
    print b.index(END)
    a.mainloop()
    (Agrandissez la fenêtre pour voir ce qu'il en est)

    3) L'option width NE définie pas le nombre de caractères/colonnes (voir l'exemple plus haut). C'est juste la largeur du Widget et les caractères affichés y sont ajustés. Regardez l'index

    4) Oui, tout objet (lettre, Widget etc) prend un caractère. A retenir pour l'insertion de Widget.

    Je vous recommande de revoir cette histoire de width car c'est la deuxième fois qu'il y a une confusion possible.
    Des tests avec un geometry manager plus simple (exemple pack) pour voir ce qu'il en est ? Sans doute.

    @+

  18. #18
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Re,

    Pour ce qui est de centrer tcl accepte l'option justify (A partir de la 8.6 ? Il me semble).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from Tkinter import *
    a=Tk()
    b=Text(a, width=9, height=10)
    b.pack(expand=1, fill=BOTH)
    b.insert(END, 'This\n')
    b.insert(END, 'is\n')
    b.insert(END, 'a\n')
    b.insert(END, 'center\n')
    b.insert(END, 'text\n')
    b.tag_configure('center', justify='center')
    b.tag_add('center', 1.0, 'end')
    a.mainloop()
    J'ai utiliser un tag mais cela se développe
    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
    from Tkinter import *
     
    def txtinsert(w, pos, texte):
        w.insert(pos, texte, 'center')
     
    a=Tk()
    b=Text(a, width=9, height=10)
    b.pack(expand=1, fill=BOTH)
    b.tag_configure('center', justify='center')
    txtinsert(b, END, 'This\n')
    txtinsert(b, END, 'is\n')
    txtinsert(b, END, 'a\n')
    txtinsert(b, END, 'center\n')
    txtinsert(b, END, 'text\n')
    a.mainloop()
    Etc...

    @+

  19. #19
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    La réprimande:
    je vous recommande de revoir cette histoire de width car c'est la deuxième fois qu'il y a une confusion possible.
    Des tests avec un geometry manager plus simple (exemple pack) pour voir ce qu'il en est ? Sans doute.
    Je parlai de l'option width d'une Scrollbar ce qui justifie mon propos que quelque soit l'orientation du widget Scrollbar definis sa largeur au sens générique (d'ou le nom de l'option) bien sur en orientation horizontal l'option width représenterai la hauteur.
    Quand au directeur de géometire .grid() je suis d'accord l'option sticky=EW étend le widget sur la largeur disponible fixer avec les options row et column.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/05/2014, 12h25
  2. Scrollbare avec un widget Text
    Par panthere_noire dans le forum Tkinter
    Réponses: 8
    Dernier message: 26/09/2008, 14h33
  3. [tkinter] widget text et scrollbar
    Par jojolapine dans le forum Tkinter
    Réponses: 3
    Dernier message: 29/04/2006, 15h58
  4. Comment centrer un Texte dans un rectangle ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 21h56
  5. Centrer un texte dans un string Grid
    Par christine dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/10/2002, 22h33

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