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

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

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

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

Python

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

Q&A

解決済

2回答

8236閲覧

python3 tkinterでフレームの幅を自動で決定して欲しい

Yuiti628

総合スコア71

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/02/24 03:38

編集2021/02/24 14:00

pythonでGUIを作成しています。

機能の一部に、アカウント名とメールアドレスを任意の数記入する場所を作りたいと思っています。

2点問題があります。

1.フレームの横幅が自動で調整されない。
windowsとMacで同じソースコードなのに、必要な横幅が違いました。
そこで、widthを指定してないでcframe2の横幅で作成したいのですが、方法が見つかりません。
イメージ説明

  1. canvas とその中に作ったwindowとの問題だと思うのですが

スクロール前のcanvas内を選択すると出てくる黒枠からwindowがはみ出てしまいます。
スクロールしたらNo.10のところは綺麗に納まっています。
これを綺麗に枠内に納めるにはどこの調整したらいいのでしょうか?
canvas7.create_window((10, 10), window=cframe2, anchor="ne")
ここの(10,10)をいじっても上手くいきませんでした。
イメージ説明

宜しくお願いします。

python3

1 2 3# tkinter 4from tkinter import * 5import tkinter as tk 6 7class Application(Frame): 8 9 def __init__(self, master=None): 10 Frame.__init__(self,master) 11 master.configure(bg="white") 12 self.pack() #描写 13 self.create_widgets(master) #フォームの作成 14 15 16 17 #フォームの作成 18 def create_widgets(self,master): 19 20 """ 21 スクロールバー Canvas 22 """ 23 24 # フォルダー表示 フレーム 25 Frm5 = Frame(master,bg="blue") 26 Frm5.bind("<Configure>", self.on_resize) 27 28 29 self.canvas7 = Canvas(Frm5 ,bg="white" , height=170) 30 31 32 bar = Scrollbar(Frm5, orient=VERTICAL) 33 bar.grid(row=0, column=1, sticky="ns") 34 bar.config(command=self.canvas7.yview) 35 bar.propagate(False) 36 37 38 Frm5.grid_columnconfigure(0, weight=1) 39 Frm5.pack(padx=10 ,pady=5 , fill="both") 40 41 # Canvas Widget を配置 42 cframe2=Frame(self.canvas7 ,bg="red") 43 self.minicanca = self.canvas7.create_window((10, 10), window=cframe2, anchor="nw") 44 self.canvas7.config(yscrollcommand=bar.set) 45 self.canvas7.grid(row=0, column=0, padx=10 ,pady=5,sticky="we") 46 47 48 49 self.Widget_items = [] 50 51 52 """ 53 アカウント名 , アイコンパス , メールアドレス , アイコン画像 ヘッダー 54 """ 55 # アカウント名 ラベル 56 L_no = tk.Label(cframe2,font=("12")) 57 L_no.configure(text="No", bg="white") 58 L_no.grid(row=0, column=0 ,pady=5,padx=5) 59 60 # アカウント名 ラベル 61 L_account = tk.Label(cframe2,font=("12")) 62 L_account.configure(text="アカウント名", bg="white" ) 63 L_account.grid(row=0, column=1,pady=5,padx=5) 64 65 # アイコンのファイル名 ラベル 66 L_account = tk.Label(cframe2,font=("12")) 67 L_account.configure(text="アイコンのファイル名", bg="white" ) 68 L_account.grid(row=0, column=2,pady=5,padx=5) 69 70 # メールアドレス ラベル 71 L_mail = tk.Label(cframe2,font=("12")) 72 L_mail.configure(text="メールアドレス", bg="white" ) 73 L_mail.grid(row=0, column=3 ,pady=5,padx=5) 74 75 76 77 """ 78 アカウント名 , アイコンパス , メールアドレス , アイコン画像 79 """ 80 81 self.Widget_items = [] 82 83 for i in range(10): 84 items = [] 85 86 # アカウント名 ラベル 87 self.L_no1 = tk.Label(cframe2) 88 self.L_no1.configure(text=f"{i+1}", bg="white") 89 self.L_no1.grid(row=i +1, column=0) 90 items.append(self.L_no1) 91 92 # アカウント名 テキストボックス 93 Text_aka = StringVar() 94 self.aka_box = Entry(cframe2,textvariable=Text_aka ,width = 25 ,font=("12") ) 95 self.aka_box.grid(row=i +1, column=1, sticky="nw") 96 items.append(self.aka_box) 97 98 99 # アイコンのファイル名とキャンバスのセット 100 ifrma = Frame(cframe2, bg="white") 101 ifrma.grid(row=i +1, column=2, sticky="nw",padx=10) 102 103 # アイコンのファイル名 テキストボックス 104 105 Text_icon = StringVar() 106 self.icon_box = Entry(ifrma,textvariable=Text_icon ,width = 15,font=("12")) 107 self.icon_box.grid(row=0, column=0, sticky="nw") 108 items.append(self.icon_box) 109 110 # アイコンの表示 111 canvas2 = Canvas(ifrma , width=24 , height=24) 112 canvas2.grid(row=0, column=1) 113 items.append(canvas2) 114 115 # アカウント名 テキストボックス 116 Text_mail1 = StringVar() 117 self.mail1_box = Entry(cframe2 , textvariable=Text_mail1 ,width = 25 ,font=("12")) 118 self.mail1_box.grid(row=i +1, column=3, sticky="n") 119 items.append(self.mail1_box) 120 121 self.Widget_items.append(items) 122 123 # canvas scroll 124 self.canvas7.update_idletasks() 125 self.canvas7.config(scrollregion=self.canvas7.bbox("all")) 126 127 128 129 # キャンバスのリサイズ 130 def on_resize(self,event): 131 self.canvas7.itemconfigure(self.minicanca, width=event.width) 132 self.canvas7.config(scrollregion=self.canvas7.bbox("all")) 133 134if __name__ == "__main__": 135 136 root = Tk() 137 app = Application(master=root) 138 app.mainloop() 139 140 141 142 143

#追記
説明不足で申し訳ありません。
フレームに色付けしました。
イメージ説明

切れていうというのは、現状の方はもっと右側にも表示しているものがあるのに表示されないということでした。

背景が赤はcframe2なのですが、これは
self.canvas7.create_window((10, 10), window=cframe2, anchor="nw")
とcreate_windowの時に使用しています。
これが認識されていないのではないかと予想しているのですが、解決方法が分かりません。

色をつけて思ったのですが、
キャンバスないのEntryをクリックするとcframe2の外枠が表示されます。
これを消す方法はないのでしょうか?
クリックしていない時は表示されていなません。

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

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

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

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

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

guest

回答2

0

ベストアンサー

かなりコードを変えなければいけないですし、
質問の趣旨に則っていないかもしれないのですが、
Canvasではなく、Frameを使用して、配置時に、
.pack(fill="both", expand=True)とかするとうまく行くかもしれないです。
正直、padをいじったりwidth, heightの指定はいい思い出がないので......

投稿2021/02/24 17:12

Marusoftware

総合スコア189

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

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

Yuiti628

2021/02/24 17:52

ありがとうございます。 私もできればサイズの指定は行いたくないです、、 問題はフレームだとスクロールバーが使えないのばないでしょうか? スクロールバーは必須なので、、
Yuiti628

2021/02/24 17:58

こんなのがあったのですね! ありがとうございます 試してみます
Yuiti628

2021/02/25 02:20

思っていたことが簡単にできました(T . T) ありがとうございます。
teamikl

2021/02/25 06:16

ScrolledFrame の利用に +1 > 正直、padをいじったりwidth, heightの指定はいい思い出がないので 同感です。テキストウィジェット以外でのwidth/heightは resize 禁止にして、placeで座標固定レイアウトを組む時用っぽいですね。
guest

0

canvas7.create_window((10, 10), window=cframe2, anchor="ne")

ここの(10,10)をいじっても上手くいきませんでした。

余白を期待しての調整だとすれば、pack/grid の padx,pady を使います。

create_window に指定する値は、scrollregion 中の何処に配置するかなので、
余白として機能させるには、scrollregion 側の座標を余白分大きめに設定する必要があります。


レイアウトの調整は、フォームやキャンバスの背景色を変更して
何処のウィジェットに調整が必要なのかを調べてみて下さい。

  • ifrma.grid_columnconfigure 辺りを確認。

Entry ウィジェットの横幅は、width プロパティとフォントサイズにより決定します。
環境で横幅が異なる場合は、フォントサイズ指定を試して下さい。


キャンバスのリサイズに対応するには、リサイズ時のイベントで設定します。
(※ 変数名等は質問のコードに対応してません)

python

1# create_window の戻り値を控えておく 2item = canvas.create_window(...) 3 4def on_resize(event): 5 # キャンバス内のフォームをリサイズに追従する場合 6 canvas.itemconfigure(item, width=event.width) 7 8 # (必要があれば) スクロール領域も更新 9 canvas.config(scrollregion=canvas.bbox("all")) 10 11# ここの frame は canvas の親のイベントに設定。 12# create_window で配置するフレームではない。 13frame.bind("<Configure>", on_resize)

掲載の画像「初期」は、画面の左端が見切れてるということですか?

確証はありませんが、create_window の anchor="ne" → "nw" に変更
を試してみて下さい。 ne だと左右の座標が反転します。

それでも治らない時は、コード末尾にて表示領域のリセットを試して下さい。

diff

1# canvas scroll 2canvas7.update_idletasks() 3canvas7.config(scrollregion=canvas7.bbox("all")) 4+ canvas7.xview_moveto(0) 5+ canvas7.yview_moveto(0)

追記:
逆だったかな、「フレームの幅を自動で決定」とのことだけど、
キャンバスの幅をフレームから求める場合は、

canvas7.update_idletasks() の後に
canvas7.config(width=cframe2.winfo_width())

投稿2021/02/24 11:49

編集2021/02/24 12:07
teamikl

総合スコア8664

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

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

Yuiti628

2021/02/24 14:04

ありがとうございます。 教えて頂いたことは試したのですが、上手くいきませんでした。 `on_resize(event)`は確かにリサイズできているので、こちらはそのまま追加されて頂きました. 「初期」の部分は切れているということで有っているのですが、全体のフレームの方でした。 canvas7が認識されていないように感じされます。 anchor="ne" → "nw"はありがとうございます????‍♂️ #追記の方に色付けしたものを追加しました。 宜しくお願いします。
teamikl

2021/02/25 06:07

>canvas7が認識されていないように感じされます。 別の質問でも触れられてるようですが、 編集後のコードを見る限り、回答に追記した部分を試されてない気がする。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問