0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

python GUI tcl/tk ウィンドウ全体リサイズ時にフォームサイズも伸縮させる

Last updated at Posted at 2024-05-11

実行サンプル

tcltk の GUIレイアウト配置で
grid や pack のオプションを適切に設定して
ユーザーがウィンドウを大きくしたり、小さくしたときに
配置された各部品(フォーム) が同時にサイズ伸縮するようにした例。

設定していないと、フォームのサイズが変わらず、
違和感のある表示になってしまう。

image.png

実行環境

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 一部のウィジェットのみ画面サイズに合わせてリサイズ

image.png

image.png

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()

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?