質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.42%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

2回答

8205閲覧

Python3 Tkinter Treeviewのテーブル表示で全ての列を表示したい

person

総合スコア223

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

1グッド

1クリップ

投稿2020/04/09 00:04

編集2020/04/09 00:54

⑨ 表(テーブル)の作成【python tkinter sqlite3で家計簿を作る】
を参考にテーブルを作成しました。

表示したときに一部の列しか表示されていないのですが、起動時に全ての列を等間隔で表示するにはどうすればいいでしょうか?
(1回全ての列が完全に表示されるまでウィンドウを広げてから狭めると等間隔になるのですが面倒なので・・・)

一応、上記サイトで記述があった各列のwidthを指定せずにやってみたのですが、すべての列は表示されませんでした。

Python

1import tkinter as tk 2import tkinter.ttk as ttk 3 4win = tk.Tk() 5win.geometry("720x480") 6 7win.rowconfigure(0, weight=1) 8win.rowconfigure(1, weight=0) 9win.columnconfigure(0, weight=1) 10 11s = ttk.Style() 12s.configure("Treeview", font=("", 20)) 13s.configure("Treeview.Heading", font=("", 25, "bold")) 14 15tree = ttk.Treeview(win) 16tree["columns"] = (1, 2, 3, 4, 5, 6, 7) 17tree["show"] = "headings" 18tree.column(1) # width指定しないでやってみたが無理だった 19tree.column(2) # width指定しないでやってみたが無理だった 20tree.column(3) # width指定しないでやってみたが無理だった 21tree.column(4) # width指定しないでやってみたが無理だった 22tree.column(5) # width指定しないでやってみたが無理だった 23tree.column(6) # width指定しないでやってみたが無理だった 24tree.column(7) # width指定しないでやってみたが無理だった 25tree.heading(1, text="Data1") 26tree.heading(2, text="Data2") 27tree.heading(3, text="Data3") 28tree.heading(4, text="Data4") 29tree.heading(5, text="Data5") 30tree.heading(6, text="Data6") 31tree.heading(7, text="Data7") 32 33tree.grid(row=0, column=0, sticky="nsew") 34 35ysb = tk.Scrollbar(win, orient=tk.VERTICAL, width=30, command=tree.yview) 36tree.configure(yscrollcommand=ysb.set) 37ysb.grid(row=0, column=1, sticky="nsew") 38 39win.mainloop()

現状
現状の画像

理想
イメージ説明

teamikl👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Treeviewの幅を列数で等分すればいいと思う.

Python

1import tkinter as tk 2import tkinter.ttk as ttk 3 4win = tk.Tk() 5win.geometry("720x480") 6 7win.rowconfigure(0, weight=1) 8win.rowconfigure(1, weight=0) 9win.columnconfigure(0, weight=1) 10 11s = ttk.Style() 12s.configure("Treeview", font=("", 20)) 13s.configure("Treeview.Heading", font=("", 25, "bold")) 14 15tree = ttk.Treeview(win) 16tree["columns"] = (1, 2, 3, 4, 5, 6, 7) 17tree["show"] = "headings" 18 19w = win.winfo_width() 20ww = int(w / 7) 21 22tree.column(1, width=ww) 23tree.column(2, width=ww) 24tree.column(3, width=ww) 25tree.column(4, width=ww) 26tree.column(5, width=ww) 27tree.column(6, width=ww) 28tree.column(7, width=ww) 29tree.heading(1, text="Data1") 30tree.heading(2, text="Data2") 31tree.heading(3, text="Data3") 32tree.heading(4, text="Data4") 33tree.heading(5, text="Data5") 34tree.heading(6, text="Data6") 35tree.heading(7, text="Data7") 36 37tree.grid(row=0, column=0, sticky="nsew") 38 39ysb = tk.Scrollbar(win, orient=tk.VERTICAL, width=30, command=tree.yview) 40tree.configure(yscrollcommand=ysb.set) 41ysb.grid(row=0, column=1, sticky="nsew") 42 43win.mainloop()

投稿2020/04/09 10:51

P_Beginner

総合スコア99

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

columnのデフォルト値はminwidth=20, width=200なので、
指定しないと width=200 で表示されるようです。

tree.column(1) # width指定しないでやってみたが無理だった

tree.column(columnId, ...オプション) と、
最初の引数は、どのカラムの設定を変えるのか指定する為に必要なので、
他のオプションを指定しない場合は、何もしないのと同じです。


解決策1: widthを設定

for col in tree["columns"]: tree.column(col, stretch=False, minwidth=98, width=98) tree.heading(col, text="Data{}".format(col))

列数や列名の変更だったり、
ウィンドウの幅変更に対応するためには、動的に計算する必要があります。

from tkinter.font import Font font = Font("", size=25, weight="bold") for col in tree["columns"]: label = "Data{}".format(col) width = font.measure(label) + 10 tree.column(col, stretch=False, minwidth=width, width=width) tree.heading(col, text=label)

解決策2: 自動でリサイズする方法

スマートではありませんが、画面外でリサイズすることで出来ました。
画面外でなくてもリサイズでカラム幅の自動調整は可能ですが、ちらつきが発生します。

# 画面外に予め大きなサイズ(200x列数以上)で開いておく win.geometry("1500x480+4000+4000") # (途中コード省略) # mainloop実行後に、リサイズ+移動される win.after(100, lambda: win.geometry("720x480+100+100")) win.mainloop()

制限事項: この場合、ウィンドウを開く位置をお任せに出来ず、位置指定の必要があります。

ウィンドウのデフォルト位置は、指定なしの場合mainloop実行前には決まっていないので、
getmetry()で問い合わせても 1x1+0+0 が返ってきます。

投稿2020/04/09 03:09

teamikl

総合スコア8679

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.42%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問