実行サンプル
tcltk の GUIレイアウト配置で
grid や pack のオプションを適切に設定して
ユーザーがウィンドウを大きくしたり、小さくしたときに
配置された各部品(フォーム) が同時にサイズ伸縮するようにした例。
設定していないと、フォームのサイズが変わらず、
違和感のある表示になってしまう。
実行環境
windows10
python3.9.5
pythonモジュール tcl/tk
実行手順
ソースコードを作成する
windowsコマンドプロンプトでプログラム作成したフォルダに移動し、下記実行する
python プログラム名.py
参考 URL
ソースコード
import os
import tkinter as tk
import tkinter.messagebox as tk_msgbox
from tkinter import ttk
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master.title("GUIlayout_expand")
self.master.geometry("400x300")
# 全体レイアウトのためのフレーム 縦にならべる(row)
self.frame00 = tk.Frame(self.master, relief='groove', borderwidth=2)
self.frame01 = tk.Frame(self.master, relief='groove', borderwidth=2)
self.frame00.grid(row=0, column=0, padx=5, pady=5, sticky="nsew") # sticky設定でウィンドウ全体リサイズに追従させる
self.frame01.grid(row=1, column=0, padx=5, pady=5, sticky="nsew")
# ユーザーによる画面リサイズ時にウィジェット大きさが追従するように設定
# グリッドの設定 全体ウィンドウの伸縮に、各部品が追従するにはこれが必須
#for i in range(1):
# root.columnconfigure(i, weight=1)
root.columnconfigure(0, weight=1)
root.rowconfigure(1, weight=1) # 画面リサイズ時の、部品リサイズ追従は 3=canvasのみ
# -------------------------
# Labelframe and Label 1, 2
# 0行目
# 部品定義
self.button1 = tk.Button(self.frame00, text="テスト", command=self.func_button1_clicked)
# 部品配置
self.button1.pack(side='left')
# 0行目
# 部品定義
self.canvas1 = tk.Canvas(self.frame01, relief='groove', borderwidth='2')
# 部品配置
self.canvas1.pack(side='left', fill="both", expand=True) # fill, expand設定で配置箇所いっぱいに広げる
def func_button1_clicked(self):
tk.messagebox.showinfo("[DEBUG]cliked")
if __name__ == "__main__":
root = tk.Tk()
app = Application(master=root)
app.mainloop()
実行サンプル2 一部のウィジェットのみ画面サイズに合わせてリサイズ
import tkinter as tk
# ユーザーがウィンドウサイズを横に広げた時
# entry1 はそれに応じて横幅が広がるように
# label1, button1はサイズが変わらないようにする
def create_ui():
root = tk.Tk()
root.title("Resizable Entry Example")
frame1 = tk.Frame(root)
frame1.grid(row=0, column=0, sticky="ew")
# Configure the grid to allow frame1 to expand horizontally
root.grid_columnconfigure(0, weight=1)
label1 = tk.Label(frame1, text="入力")
label1.pack(side="left")
entry1 = tk.Entry(frame1)
entry1.pack(side="left", fill="x", expand=True)
button1 = tk.Button(frame1, text="選択")
button1.pack(side="left")
# Configure the entry to expand with the window
#frame1.pack_propagate(False)
#frame1.pack(fill="x", expand=True)
root.mainloop()
if __name__ == "__main__":
create_ui()