2016-03-21 6 views
3

Pythonで連結文字列テキストを表示するメッセージボックスが必要です。 テキストは整列されたままにしたいが、整列しないようにしたい。 私はljust(){:<14}などを試しましたが、それでもまだ整列していません。Tkinterでの文字列の整列

それはこのように思える:

enter image description here

コード片は、以下の私は私のメッセージボックスにそれらのテキストを追加した後、ループ

for todo_item in resp.json()['SectorList']: 
    sector_id +='Sector Id: {:<14}'.format(todo_item['SectorId']) + '\n' 
    sector_name += 'Sector Name: {:<40}'.format(todo_item['SectorName']) + '\n' 

です。

セクターIDの部分は正常ですが、セクター名は左揃えではありません。何か案が?

+0

を。コード自体ではありません – AlanSTACK

+0

ありがとう@Alan。非単位長フォントの問題を解決する方法、単位長フォントを作成する方法について考えていますか? – Hilal

+0

Iveは以下のより完全な答えをどのように行うかを掲載しました。 – AlanSTACK

答えて

1

コードに問題はありません。

問題は、非単位長non-monospaceフォントを使用していて、文字が同じ量のスペースを占有していないことにあります。

これは、位置合わせのためのフォントに依存ので、あなたのコードでは、

label_id = tkinter.Label(f, anchor=tkinter.W, text=sector_id, font=('Consolas', 15)) 
label_name = tkinter.Label(f, anchor=tkinter.W, text=sector_name, font=('Consolas', 15)) 
+0

優れた作品です!どうもありがとう。 Python 3では、import tkFontは機能しません。 import tkinter.fontが必要です。しかし、それがなければ、フォント名を直接使用すると(tkFont.Font(Family = 'Consolas' bla bla)を使用せずに)、それは動作します。再度、感謝します ! – Hilal

4

ようなものになるだろうconsolas

import tkFont 

my_font = tkFont.Font(family='Consolas', size=15, weight='bold') 

# then plug in the font to your widget ... 

ようmonospaceのフォントに変更することで固定することができますが、悪い習慣です。前述したようにモノスペースのフォントでしか動作しませんが、は本当にアプリケーション全体でモノスペースフォントを使用したいアラインメントは?私は確かにしません。 LabelInputなどに変更したい場合はどうすればよいですか?調整のために新しいLabelを追加する必要がありますか?

したがって、固定幅フォントに変更すると「うまくいく」よりも、Tkが提供するツールを使用する方が良いでしょう。

たとえば、固定幅に最初の列にLabel()を設定することができます。

import tkinter 

# Just some random strings of different sizes from my dictionary 
names = ['Algol', 'American', 'Americanises', 'Americanising', 'Americanism', 
    'Argentine', 'Argentinian', 'Ariz', 'Arizona', 'Armstrong'] 

root = tkinter.Tk() 
tkinter.Label(root, text='Lists:', anchor=tkinter.W).grid(row=0, column=0, sticky=tkinter.W) 
for i in range(0, 10): 
    label_id = tkinter.Label(root, width=30, anchor=tkinter.W, text='Sector %s' % i) 
    label_name = tkinter.Label(root, anchor=tkinter.W, text=names[i]) 

    label_id.grid(row=i+1, column=0, sticky=tkinter.W) 
    label_name.grid(row=i+1, column=1, sticky=tkinter.W) 

root.mainloop() 

はしかし、これを行うにはより多くの方法があります。 columnconfigureを使用して幅を設定することによって、例えば:

import tkinter 

# Just some random strings of different sizes from my dictionary 
names = ['Algol', 'American', 'Americanises', 'Americanising', 'Americanism', 
    'Argentine', 'Argentinian', 'Ariz', 'Arizona', 'Armstrong'] 

root = tkinter.Tk() 
root.columnconfigure(0, minsize=150) 
tkinter.Label(root, text='Lists:', anchor=tkinter.W).grid(row=0, column=0, sticky=tkinter.W) 
for i in range(0, 10): 
    label_id = tkinter.Label(root, anchor=tkinter.W, text='Sector %s' % i) 
    label_name = tkinter.Label(root, anchor=tkinter.W, text=names[i]) 

    label_id.grid(row=i+1, column=0, sticky=tkinter.W) 
    label_name.grid(row=i+1, column=1, sticky=tkinter.W) 

root.mainloop() 

columnconfigure()を使用する利点は、最小幅が列の内容とは無関係であるということです。したがって、後でLabel()を別のものに変更すると、レイアウトは引き続き機能するはずです。この列の幅を明示的に設定する必要があることはもう少し明らかです。

+0

私はpython2.66を使ってボタンのグリッドを持つアプリケーションを持っています。幅(私がそれを理解している場合)は、文字が文字の場合は文字数で、画像が使用されている場合はピクセル数で与えられます。文字の幅が固定されていない場合、どのように動作しますか? – Marichyasana

+0

@Marichyasana 'Label'の幅は実際にテキスト単位です。私は、Tkが内部的に "テキストユニット"として使うものは完全にはわかりませんが、それは本当に問題ではありません。比例フォントを使用していても、1つの "テキストユニット"は固定ピクセル数です。このサイズはフォントサイズに比例します(これは、テキストサイズを変更すると間隔が広がるため)... CSSでは 'em'のようです。 – Carpetsmoker

+0

ありがとうございますこれもうまくいきます。説明と役に立つ情報に感謝します。 – Hilal

3

このアプローチを使用するには、固定幅フォントが必要です。

プラットフォームごとに、TkInterは「TkFixedFont」を含む標準フォントを提供します。これは、現在のプラットフォーム用の固定まとも(および利用可能な)幅フォントに対応しなければならないので、以下では、固定幅フォントを取得するための簡単かつポータブルな方法である:これは非単位長フォントに問題がある

label_id = tkinter.Label(f, anchor=tkinter.W, text=sector_id, font='TkFixedFont')