2

私はこのコマンドを使用しています:

self.licenseBox.insert(END, "{:30}{:90}{:20}{:5}".format(item[0],
                                                    item[1], item[2], item[3]))

ただし、 .format は項目を追加してから列幅を追加します。たとえばif item[0] = "foo"、最初の列の幅は 33 で、次のパラメータが 3 ずれていることを意味します。

回避策はありますか?

4

2 に答える 2

5

ただし、 .format は項目を追加してから列幅を追加します。

format() はそのようなことはしません:

print "1234567890" * 2
print "{:4}{:4}{:4}{:4}".format('aaaa', 'bbbb', 'cccc', 'dddd')

--output:--
12345678901234567890
aaaabbbbccccdddd

出力の合計幅は 16 = 4 x 4 です。

アラインメントを明示的に指定する必要があります。

lb.insert(tk.END, "{:<5}-{:<2}".format(123, 9))

ドキュメントは言う:

'<'   Forces the field to be left-aligned within the available space 
      (this is the default for most objects).

その「ほとんどのオブジェクト」言語は、あなたが反抗している可能性があると私が思うものです。文字列、数値などには__format__()、 format() メソッドを呼び出したときに表示するよう求められたときに呼び出されるメソッドがあります。これをチェックしてください:

print "{:4}".format("a")
print "{:4}".format(9)

--output:--
a   
   9

文字列と数値は、正当化のデフォルトが異なります。したがって、デフォルトに依存するのではなく、明示的に指定すると、出力がどのように正当化されるかがわかります。

そうは言っても、実際に 10 を取得するには、最小フィールド幅に 17 を使用する必要があります。

import Tkinter as tk

root = tk.Tk()
root.geometry("1000x200")

lb = tk.Listbox(root, width=150)
lb.insert("1", "{:4}{:4}".format("a", "b") )
lb.insert(tk.END, "1234567890" * 4)
lb.insert(tk.END, "{:<17}{:<10}".format(100, 200) )
lb.pack()

root.mainloop()

そのコードでは、列 11 から始まる 200 が表示されます。この整列の問題は、固定幅ではないデフォルトのフォントを使用する tkinter に関係しています。つまり、すべての文字が同じ量のスペースを占めているわけではありません。列を揃えようとしている場合は、固定幅フォントを使用する必要があります。次のようなことを試してください:

import Tkinter as tk
import tkFont

root = tk.Tk()

my_font = tkFont.Font(family="Monaco", size=12)  #Must come after the previous line.

root.geometry("1000x200")

lb = tk.Listbox(root, width=150, font=my_font)
lb.insert("1", "{:4}{:4}".format("a", "b") )
lb.insert(tk.END, "1234567890" * 4)
lb.insert(tk.END, "{:>10}{:>10}".format(100, 200) )
lb.pack()

root.mainloop()
于 2013-06-26T01:25:05.807 に答える
1

ウィンドウズ

listbox = Listbox(master, width=60, font='consolas')

私はLinuxを使用してfont='mono'います。

于 2020-08-08T15:52:04.770 に答える