En python, il est facile de remplir une chaîne d'espaces en fonction du nombre de caractères. Par exemple:

print "aaa".ljust(10) + "end"
print "www".ljust(10) + "end"

La sortie est:

aaa       end
www       end

Ce qui a fière allure ici ou dans tout autre affichage où la taille de tous les caractères est égale. Mais quand je produis ces deux chaînes dans un programme Tkinter, elles ne sont pas alignées car les caractères «a» et «w» ont des longueurs différentes dans n'importe quelle police Tkinter.

Comment puis-je aligner des chaînes dans Tkinter?

Mon code:

from Tkinter import *

STANDARD_FONT = ("David",14)

TO = "TO"
SUBJECT = "SUBJECT"
DATE = "DATE"

content = [
    {TO:'Frye', SUBJECT:'Water Pipe Replacement Cost', DATE:'July 9'},
    {TO:'George', SUBJECT:'Fw: Cell phone reimbursement', DATE:'July 9'},
    {TO:'George, Tim', SUBJECT:'Travel', DATE:'July 10'},
    {TO:'Sandy, Jim', SUBJECT:'Fw: Welcome to WOW! - News', DATE:'July 10'},
    {TO:'Sandy, Jim', SUBJECT:'Re: Present from paulette', DATE:'July 10'},
    {TO:'George, Tim, Sandy, Jim', SUBJECT:'Voices Across Alaska: State Budget Priorities', DATE:'July 10'},
    {TO:'Frye', SUBJECT:'FW: Confirmation of the Novemberl 5th discussion', DATE:'July 10'},
    {TO:'Jim', SUBJECT:'Re: Happy Thanksgiving!', DATE:'July 11'}
]

def makeWindow () :
    global nameVar, phoneVar, select
    win = Tk()

    frame1 = Frame(win)
    frame1.pack()

    frame2 = Frame(win)       # Row of buttons
    frame2.pack()

    frame3 = Frame(win)       # select of names
    frame3.pack()
    scroll = Scrollbar(frame3, orient=VERTICAL)
    select = Listbox(frame3, yscrollcommand=scroll.set, height=17, width=100, font=STANDARD_FONT)
    scroll.config (command=select.yview)
    scroll.pack(side=RIGHT, fill=Y)
    select.pack(side=LEFT,  fill=BOTH, expand=1)
    return win

def format_mail_str(mail):
    to = "To: " + mail[TO]
    subject = mail[SUBJECT]
    date = mail[DATE]
    spacing = " " * 5

    return to.ljust(40) + spacing + subject.ljust(30) + spacing + date.ljust(15)


def setSelect () :
    select.delete(0,END)
    for mail in content:
        select.insert (END, format_mail_str(mail))

win = makeWindow()
setSelect ()
win.mainloop()

Je veux que le sujet et la date soient alignés entre toutes les lignes.

4
zvisofer 10 juil. 2015 à 16:56

2 réponses

Meilleure réponse

Sous Windows, ce code aligne exactement «fin»:

import tkinter

root = tkinter.Tk()
displaytext1 = "aaa".ljust(10) + "end"
displaytext2 = "www".ljust(10) + "end"
tkinter.Label(root, text=displaytext1, font = "Courier").pack()
tkinter.Label(root, text=displaytext2, font = "Courier").pack()

root.mainloop()

Vérifiez la valeur de platform.system () et utilisez d'autres polices à largeur fixe en fonction du système d'exploitation.

2
Jim K 10 juil. 2015 à 14:43

Je ne vais pas répondre à la question que vous avez posée, mais je proposerai une solution à votre problème. Ce que vous voulez, ce sont plusieurs colonnes. Il y a un widget pour ça dans tkinter, c'est une arborescence.

Voir par exemple: http://www.tkdocs.com/tutorial/tree.html

Je recommande généralement le

show='headings'

Option dans le constructeur Treeview lorsque vous voulez une liste (et non un arbre).

2
Eric Levieil 10 juil. 2015 à 15:04