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

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

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

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

Python

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

Q&A

解決済

1回答

1442閲覧

Python3のtkinterでScrolledFrameの範囲をコントロールして使いたい

Yuiti628

総合スコア71

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/05/26 07:25

python3 でGUIを作成しております。

やりたいこと

表のようにEntryやLavelを縦に並べてそこにはスクロールバーをつけたいと思っています。
イメージ説明

一番上の行はカラム名なのでスクロールバー の範囲からは外したいのです。
幅や位置は下の入力欄に合わせたいです。

widthなどを計算して無理やり幅を決定するのは使いたくないと思っています。
項目名がない列があったりするので、できれば自動で調整できる方が望ましいです。

# 試したこと
写真のように、masterフレームの中に、subフレームを入れることができないかなと思ったのですが、全然うまくいきませんでした。

subフレームの上に違うフレームを作り、2つを繋げたら、配置ズレてしまいました。

スクロールバー を使う場合は基本的な使い方のような気がするのですがなかなか見つからなく困っております。
よろしくお願いします。

# tkinter from tkinter import * import tkinter as tk from tkscrolledframe import ScrolledFrame class Application(Frame): def __init__(self, master=None): Frame.__init__(self,master) master.configure(bg="white") self.pack() #描写 self.create_widgets(master) #フォームの作成 #フォームの作成 def create_widgets(self,master): Sfram = ScrolledFrame(master) Sfram.pack(padx=10 ,pady=5 , fill="both" , side="top", expand=1) Sfram.bind_arrow_keys(root) Sfram.bind_scroll_wheel(root) inner_frame = Sfram.display_widget(Frame) num_rows = 10 num_cols = 3 labels = ['項目1' , '項目2' , '項目3'] for i in range(len(labels)): w = Label(inner_frame, borderwidth=2, relief="groove", text = labels[i] ) w.grid(row=0, column=i, padx=4, pady=4) for row in range(num_rows): for column in range(num_cols): if column %2==1: w = Label(inner_frame, width=15, borderwidth=2, relief="groove", text = str((row+1) * (column+1)) ) else: w = Label(inner_frame, width=25, borderwidth=2, relief="groove", text = str((row+1) * (column+1)) ) w.grid(row=row+1, column=column, padx=4, pady=4) root.update() Sfram.config(width=inner_frame.winfo_width()) if __name__ == "__main__": root = Tk() root.option_add('*font', ('Ricty Diminished', 12)) app = Application(master=root) app.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

subフレームの上に違うフレームを作り、2つを繋げたら、配置ズレてしまいました。

恐らくやりたいことにとっては、この実装方法が一番の近道だと思います。
カラム名は別のフレームにして、スクロールフレームの外側に配置します。

配置ズレに関しては、カラム名が別フレームで入力欄の幅の影響を受けない為なので、
この部分の自動調整をするのが、解決策としては最も簡単な方法です。

python

1# thead ... カラム名のフレーム 2# tbody ... 入力欄のフレーム 3# 双方のフレームに grid() で配置して、リサイズ時に入力欄の 4# grid_columnconfigure の minsize 値を反映します、 5 6def on_table_resize(event): 7 for idx in range(len(labels)): 8 size = thead.grid_columnconfigure(idx)["minsize"] 9 tbody.grid_columnconfigure(idx, minsize=size) 10 11tbody.bind("<Configure>", on_table_resize)

※スクロールバーやフレームの枠の幅に関しては、
padx, pady で微調整が必要かもしれません。(未テスト)


他の方法:

  • ttk.Treeview

 → 入力欄に対応していない。独自の実装が必用。

  • tktable, pandastable 等の外部ライブラリ
  • カラム名・入力欄は同フレーム内に固定配置にして、スクロールでデータのみ動かす実装方法。

 → 入力欄の数が膨大な場合等はこの方法が良い。

  • grid の最初の行に余白を取り、place() でカラム名を重ね合わせ表示する。

 → リサイズ時に width の追従は必要。

投稿2021/05/26 22:13

編集2021/05/26 22:16
teamikl

総合スコア8760

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

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

Yuiti628

2021/05/27 03:29

ありがとうございます。 やはりそんな簡単ではないのですね、、 Subフレームを作って、ヘッダー部分は頑張って微調整したいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問