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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

12300閲覧

Python(TkInter) TreeViewを導入する前に確認、列と行を仕切る罫線は表示できないか、照会機能にしか用えないのか(空白行を常に表示し、レコード登録することに使えないか)

saya24

総合スコア244

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/05/26 03:05

この記事をはじめ、TreeViewについてネット上の記事を模索しましたが
標題のことが分からなかったので 質問させて頂きます。

①列と行を仕切る罫線は表示できないのでしょうか(表示されていないサンプルばかりが目立つ!)

②空白行を選択してレコードの登録を行う、もしくは表示された行の内容を上書きするようなことはできないのでしょうか?

初歩的なことと思われますが よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

イメージ説明

ttk.Styleで出来ないか、挑戦してみましたが、このあたりが限界。縦の余白は、
ライブラリ内部(ttk の C言語のソース)で左右に固定値で余白をとっていて
外部からパラメーターで調整する方法は見当たりませんでした。

Ttk_Padding cellPadding = {4, 0, 4, 0};

※ tk のバージョンによっては、Treeview のスタイル関連で一部動かないコードがあります。
tk側の不具合

例えば、tag をつけて行毎のスタイルを指定する場合等、パッチが必要になります。

イメージ説明

解決策としては、丸投げになりますが

レイアウトや見栄えに関して、複雑な要求がある場合は、
可能なら他の GUI ライブラリや、HTMLが使えるものにするのも選択肢です。

tkinter のスタイルに関する情報は殆どなくて、
Tcl言語のコードや、その大元のライブラリのコード(C言語)を探すことになります。

一応、tkinter は tcl のライブラリ資産も活かせるのですが、
サンプルコードなどは殆ど見かけられないので、導入のハードルは高いです。


空白行を選択してレコードの登録を行う、
もしくは表示された行の内容を上書きするようなことはできないのでしょうか?

ttk.Treeview では対応してません。

自分で、クリックした位置のセルにポップアップで 入力ウィジェットを表示~
等の実装をすることになります。


各セルに枠を付ける例 (windowsのみ、不完全なコード)

python

1import tkinter as tk 2from tkinter import ttk 3 4root = tk.Tk() 5style = ttk.Style(root) 6tree = ttk.Treeview(root, show="headings", columns=["key", "value"]) 7for name in tree["columns"]: 8 tree.heading(name, text=name) 9for num in range(10): 10 tree.insert("", "end", values=[num, num]) 11tree.pack(fill=tk.BOTH, expand=True) 12 13 14style.configure("Treeview", padding=10) 15style.configure("Treeview.Heading", padding=10) 16style.configure("Treeview.Cell", padding=1) 17 18# NOTE: windows only 19root.tk.eval(""" 20 ttk::style element create plain.field vsapi \ 21 EDIT 6 {disabled 4 focus 3 hover 2 {} 1} -padding {5 2 5 5} 22""") 23 24style.layout("Treeview.Cell", [ 25 (".plain.field", { 26 "sticky": "snwe", 27 "children": [ 28 ("Treeview.padding", { 29 "sticky": "snwe", 30 "children": [ 31 ("Treeview.text", {"sticky": "e",}) 32 33 ]}) 34 ] 35 }) 36]) 37style.map("Treeview", 38 foreground=[("focus", "black")], 39 background=[], 40 filledbackground=[], 41) 42 43root.mainloop()

行背景を変えるときのパッチ

python

1import tkinter as tk 2from tkinter import ttk 3 4def fixture_treeview_tag_config(style): 5 # NOTE: https://bugs.python.org/issue36468 6 def fixed_map(option): 7 # Fix for setting text colour for Tkinter 8.6.9 8 # From: https://core.tcl.tk/tk/info/509cafafae 9 return [elm for elm in style.map('Treeview', query_opt=option) if 10 elm[:2] != ('!disabled', '!selected')] 11 12 style.map('Treeview', 13 foreground=fixed_map('foreground'), 14 background=fixed_map('background')) 15 16 17root = tk.Tk() 18tree = ttk.Treeview(root) 19tree.config( 20 show="headings", 21 columns=["key", "value"], 22) 23for name in tree["columns"]: 24 tree.heading(name, text=name) 25 26style = ttk.Style() 27fixture_treeview_tag_config(style) 28style.element_create("Treeheading.border", "from", "default") 29style.configure("Treeview.Heading", 30 font=('Calibri', 13, 'bold'), 31 background="#aaaaaa", 32 foreground="white", relief="flat") 33tree.tag_configure('odd', background='#eeeeee') 34tree.tag_configure('even', background='#DFDFDF') 35 36for idx, num in enumerate(range(1, 10)): 37 tag = ["odd", "even"][idx % 2] 38 tree.insert("", tk.END, values=["key{}".format(num), num], tags=(tag,)) 39 40tree.pack(fill=tk.BOTH, expand=True) 41 42root.mainloop()

投稿2020/05/27 09:48

teamikl

総合スコア8681

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

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

saya24

2020/05/27 11:57

teamiklさん なんとか解決する手立てのコードの提示まで頂き誠にありがとうございます。 やはり一筋縄ではいかないのですね。 ちょっと採用を慎重に考えてみます、作成頂いたコードは決して無駄にしません! まずは重ねてお礼まで
teamikl

2020/05/27 14:17

上の方のコードは、問題点が多すぎる為オススメはしません。 例えばここから「選択時の背景色をかえたい」時にも簡単には対応できません。 下は妥協案のような感じです。python/tk のバージョンにより挙動が違うかもしれないのが注意点です。 外部ライブラリでは、tksheet が良さそうでした。 https://pypi.org/project/tksheet/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問