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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Tkinter

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

Python

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

Q&A

解決済

2回答

4344閲覧

python treeview 改行表示方法

ekTJ

総合スコア109

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/12/16 02:32

編集2020/12/16 05:48

pythonにてtreeview作成中なのですが、疑問です。
例えば下記のようにtreeにinsertする際、2列目のhinmeiはtxt4のTextから文章を抜き取ります。

その時、
①treeにinsertした時2行23文字ずつの表示にしたいです。

今のスクリプトだと、何文字入力しても1行での表示になってしまいます。
宜しくお願い致します。

python

1#ライブラリインポート 2import tkinter as tk 3import tkinter.messagebox as tkm 4from tkinter.scrolledtext import ScrolledText 5import tkinter.ttk as ttk 6import cx_Oracle 7import os 8import csv 9import pandas as pd 10import textwrap 11 12#情報 13desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\Desktop"+"\" 14names = ["配布先","品番表示","枝番表示","商品名1","商品名2","税率","税込小売価格","本体小売価格","税込卸価格","本体卸価格","入数表示","出力枚数","入力者番号"] 15df = pd.DataFrame(columns=names) 16 17def btn_click1(): 18 pass 19 df.to_csv("_{}.csv", index= False,encoding="shift-jis") 20 tkm.showinfo("情報", "CSVを保存しました") 21 22def btn_click(): 23 24 haihin = str(txt1.get()) 25 hinmei = "\n".join(textwrap.wrap(txt4.get('1.0', 'end -1c'), width=23)) 26 code= str(txt2.get()) 27 mai= str(txt5.get()) 28 tree.insert("", "end", tags=i,values=(code,hinmei,mai,1,1,1,1,1,1)) 29 30#画面表示 31root = tk.Tk() 32root.geometry('1300x800+250+100') 33root.title('入力画面') 34root.minsize(width=1300, height=800) 35 36#配布先FLBX 37lbl1 = tk.Label(text='配布先FLBX',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 38lbl1.place(x=10, y=18) 39txt1 = tk.Entry(width=10) 40txt1.place(x=105, y=20) 41 42#商品コード 43lbl2 = tk.Label(text='商品コード',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 44lbl2.place(x=10, y=50) 45txt2 = tk.Entry(width=30) 46txt2.place(x=105, y=52) 47lbl2_1 = tk.Label(text='10桁入力(品番/CL/SZ)',font=(u'MS ゴシック', 9, 'bold')) 48lbl2_1.place(x=290, y=55) 49 50#登録内容 51lbl3 = tk.Label(text='登録内容',font=(u'MS ゴシック', 11, 'bold')) 52lbl3.place(x=15, y=92) 53 54#商品名 55lbl4 = tk.Label(text='商品名',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 56lbl4.place(x=105, y=92) 57txt4 = tk.Text(root, font=(u'MS ゴシック', 11, 'bold'),width=23,height=2)#字数制限、要確認!! 58txt4.place(x=165, y=94) 59#txt4.configure(state='disabled') 60 61#出力枚数 62lbl5 = tk.Label(text='出力枚数',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 63lbl5.place(x=380, y=90) 64txt5 = tk.Entry(width=20) 65txt5.place(x=380, y=110) 66txt5.insert(tk.END,1) 67 68#商品情報 69lbl6 = tk.Label(text='小売価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 70lbl6.place(x=540, y=90) 71 72lbl7 = tk.Label(text='本体価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 73lbl7.place(x=540, y=110) 74 75lbl8 = tk.Label(text='卸価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 76lbl8.place(x=774, y=90) 77 78lbl9 = tk.Label(text='卸本体価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 79lbl9.place(x=740, y=110) 80 81lbl10 = tk.Label(text='消費税率 '+ " 10%",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 82lbl10.place(x=954, y=90) 83 84lbl11 = tk.Label(text='入数表示 '+ " (@×,××)",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) 85lbl11.place(x=954, y=110) 86 87#登録ボタン 88btn = tk.Button(root, text='登録',width=8, font=("Menlo",11), bg="yellow2",command=btn_click) 89btn.place(x=1170, y=105) 90 91#保存ボタン 92btn1 = tk.Button(root, text='保存',width=8, font=("Menlo",11), bg="yellow2",command=btn_click1) 93btn1.place(x=1170, y=440) 94 95#商品コード 96lbl12 = tk.Label(text='商品コード',font=(u'MS ゴシック', 11, 'bold')) 97lbl12.place(x=10, y=160) 98 99 100#treeview 101frame = tk.Frame() 102frame.place(x=50,y=190) 103 104tree = ttk.Treeview(frame) 105tree.grid(row=0, column=0) 106tree["columns"] = (1,2,3,4,5,6,7,8,9) 107tree["show"] = "headings" 108 109tree.column(1,width=180) 110tree.column(2,width=200) 111tree.column(3,width=60) 112tree.column(4,width=140) 113tree.column(5,width=140) 114tree.column(6,width=140) 115tree.column(7,width=140) 116tree.column(8,width=60) 117tree.column(9,width=140) 118 119tree.heading(1,text="商品コード") 120tree.heading(2,text="商品名") 121tree.heading(3,text="出力枚数") 122tree.heading(4,text="小売価格") 123tree.heading(5,text="本体価格") 124tree.heading(6,text="卸価格") 125tree.heading(7,text="卸本体価格") 126tree.heading(8,text="消費税率") 127tree.heading(9,text="入数表示") 128 129 130ysb = tk.Scrollbar(frame, orient=tk.VERTICAL, width=16, command=tree.yview) 131tree.configure(yscrollcommand=ysb.set) 132ysb.grid(row=0, column=1, sticky='news') 133 134#表示保持 135root.mainloop()

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

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

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

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

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

guest

回答2

0

以下は縦幅が見切れる状況の再現。
コメントアウトした部分が、縦幅の設定方法です。
具体的な値は、フォントサイズ等により変わるので、適宜調整してください。

python

1import tkinter as tk 2from tkinter import ttk 3import textwrap 4 5root = tk.Tk() 6tree = ttk.Treeview(root) 7tree.grid(row=0, column=0) 8tree["columns"] = (1,) 9tree["show"] = "headings" 10tree.column(1,width=200) 11tree.heading(1,text="商品名") 12 13style = ttk.Style() 14# style.configure("Treeview", rowheight=40) 15 16name = "\n".join(textwrap.wrap("あ"*60, width=23)) 17tree.insert("", tk.END, values=(name,)) 18 19root.mainloop()

投稿2020/12/16 06:05

teamikl

総合スコア8760

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

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

0

ベストアンサー

Treeview 自体は、改行を含む複数行の表示は可能です。

もし hinmei に改行文字が含まれるのに、1行でしか表示されないのなら、
問題を再現できる、「最小限の」「実行可能な」コードを提示してください。

Text の width=23 で23文字区切りを期待してるようでしたら、
ウィジェットの表示横幅なので、自動改行ではありません。

テキストの折り返しには textwrap モジュールが使えます。
hinmei = "\n".join(textwrap.wrap(txt4.get('1.0', 'end -1c'), width=23))

投稿2020/12/16 04:45

teamikl

総合スコア8760

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

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

ekTJ

2020/12/16 05:07

おっしゃる通りの方法で2行に表示が出来ました!!ありがとうございます!! ただ、treeview内で表示が見切れてしまうのはなにが原因でしょうか?
teamikl

2020/12/16 05:36 編集

どのように見切れるかによりますが、横幅もしくは縦幅の設定でしょうか その辺りは、具体的なコード + 実際に入力したデータ が無いと解らない部分です。 候補としては、 - Treeview の column の width - Treeview のスタイル rowheight (例えば、フォントサイズを大きくした場合、合わせて調整が必要)
ekTJ

2020/12/16 05:38

''' #ライブラリインポート import tkinter as tk import tkinter.messagebox as tkm from tkinter.scrolledtext import ScrolledText import tkinter.ttk as ttk import cx_Oracle import os import csv import pandas as pd import textwrap #情報 desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\Desktop"+"\" names = ["配布先","品番表示","枝番表示","商品名1","商品名2","税率","税込小売価格","本体小売価格","税込卸価格","本体卸価格","入数表示","出力枚数","入力者番号"] df = pd.DataFrame(columns=names) def btn_click1(): pass df.to_csv("_{}.csv", index= False,encoding="shift-jis") tkm.showinfo("情報", "CSVを保存しました") def btn_click(): haihin = str(txt1.get()) hinmei = "\n".join(textwrap.wrap(txt4.get('1.0', 'end -1c'), width=23)) code= str(txt2.get()) mai= str(txt5.get()) #SQL= tree.insert("", "end", tags=i,values=(code,hinmei,mai,1,1,1,1,1,1)) # tagが奇数か偶数か判定 #if i & 1: # tagが奇数(レコードは偶数)の場合のみ、背景色の設定 #tree.tag_configure(i,background="#CCFFFF") #i+=1 try: df= df.append(values=["haihin","code","枝番表示",hinmei,"商品名2","税率","税込小売価格","本体小売価格","税込卸価格","本体卸価格","入数表示","出力枚数","入力者番号"]) print(df) except: pass #画面表示 root = tk.Tk() root.geometry('1300x800+250+100') root.title('入力画面') root.minsize(width=1300, height=800) #配布先FLBX lbl1 = tk.Label(text='配布先FLBX',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) lbl1.place(x=10, y=18) txt1 = tk.Entry(width=10) txt1.place(x=105, y=20) #商品コード lbl2 = tk.Label(text='商品コード',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) lbl2.place(x=10, y=50) txt2 = tk.Entry(width=30) txt2.place(x=105, y=52) lbl2_1 = tk.Label(text='10桁入力(品番/CL/SZ)',font=(u'MS ゴシック', 9, 'bold')) lbl2_1.place(x=290, y=55) #登録内容 lbl3 = tk.Label(text='登録内容',font=(u'MS ゴシック', 11, 'bold')) lbl3.place(x=15, y=92) #商品名 lbl4 = tk.Label(text='商品名',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) lbl4.place(x=105, y=92) txt4 = tk.Text(root, font=(u'MS ゴシック', 11, 'bold'),width=23,height=2)#字数制限、要確認!! txt4.place(x=165, y=94) #txt4.configure(state='disabled') #出力枚数 lbl5 = tk.Label(text='出力枚数',relief="ridge",font=(u'MS ゴシック', 11, 'bold')) lbl5.place(x=380, y=90) txt5 = tk.Entry(width=20) txt5.place(x=380, y=110) txt5.insert(tk.END,1) #商品情報 lbl6 = tk.Label(text='小売価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) lbl6.place(x=540, y=90) lbl7 = tk.Label(text='本体価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) lbl7.place(x=540, y=110) lbl8 = tk.Label(text='卸価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) lbl8.place(x=774, y=90) lbl9 = tk.Label(text='卸本体価格 '+ " 0,000",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) lbl9.place(x=740, y=110) lbl10 = tk.Label(text='消費税率 '+ " 10%",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) lbl10.place(x=954, y=90) lbl11 = tk.Label(text='入数表示 '+ " (@×,××)",relief="ridge",font=(u'MS ゴシック', 11, 'bold')) lbl11.place(x=954, y=110) #登録ボタン btn = tk.Button(root, text='登録',width=8, font=("Menlo",11), bg="yellow2",command=btn_click) btn.place(x=1170, y=105) #保存ボタン btn1 = tk.Button(root, text='保存',width=8, font=("Menlo",11), bg="yellow2",command=btn_click1) btn1.place(x=1170, y=440) #商品コード lbl12 = tk.Label(text='商品コード',font=(u'MS ゴシック', 11, 'bold')) lbl12.place(x=10, y=160) #treeview frame = tk.Frame() frame.place(x=50,y=190) tree = ttk.Treeview(frame) tree.grid(row=0, column=0) tree["columns"] = (1,2,3,4,5,6,7,8,9) tree["show"] = "headings" tree.column(1,width=180) tree.column(2,width=200) tree.column(3,width=60) tree.column(4,width=140) tree.column(5,width=140) tree.column(6,width=140) tree.column(7,width=140) tree.column(8,width=60) tree.column(9,width=140) tree.heading(1,text="商品コード") tree.heading(2,text="商品名") tree.heading(3,text="出力枚数") tree.heading(4,text="小売価格") tree.heading(5,text="本体価格") tree.heading(6,text="卸価格") tree.heading(7,text="卸本体価格") tree.heading(8,text="消費税率") tree.heading(9,text="入数表示") ysb = tk.Scrollbar(frame, orient=tk.VERTICAL, width=16, command=tree.yview) tree.configure(yscrollcommand=ysb.set) ysb.grid(row=0, column=1, sticky='news') #表示保持 root.mainloop() '''
ekTJ

2020/12/16 05:39

teamikl様、ご指摘通り早々にコードを記載するべきでした。申し訳ございません。
teamikl

2020/12/16 05:43

出来れば不要な部分を除いた動かせるコードを、質問欄への掲載をお願いします。 コメント欄ではインデント情報が失われるので、インデントを復元しないと実行できません。 質問用に、Treeview と Text のみの小さなプログラムを作り、 問題が再現するかどうかを試してみてください。
ekTJ

2020/12/16 05:50

何度も申し訳ございません。質問欄を修正し動かせるコードを記載しました。 ちなみに[商品名]の縦幅(行)が見切れてしまいます。
teamikl

2020/12/16 06:04

別の質問でも同じ状況だったのですが、NameError: name 'i' is not defined がでます。 tkinter の表示に関する質問なので、 pandas, cx_Oracle 等の不要なモジュールは省いてもらえると助かります。 縦幅であれば rowheight の設定ですね。コードを別回答に投稿します
teamikl

2020/12/16 06:29 編集

一点だけ補足、(CSVに保存とあったので) hinmei = "\n".join(textwrap.wrap(txt4.get('1.0', 'end -1c'), width=23)) は、データ内に改行文字を含んでしまいますが、CSV等に保存する場合は省いておいて、 表示時のみ textwrap を使うようにしたほうが良いかもしれません。 ライブラリを使って保存すれば、保存時に改行文字はエスケープされて保存されると思いますが、 元々の入力に改行文字が含まれる場合に対する対応も必要です。
ekTJ

2020/12/16 07:15

teamikl様、ご丁寧に最後までありがとうございました!! 無事に希望通り23字で折り返し、表示することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問