Sibainu Relax Room

柴犬と過ごす

Python で Tkinter を使ってみる1

柴犬は気温が下がり気分がよくなったのかキリっとした顔になりました。

概要

前回、エクセルでバックアップを考えました。

それを Python の Tkinter を使ってフォームでするとどうなるか試してみました。

自分の力量でも何とかフォームを作るところまでできましたので記録します。

作ったフォームの画像です。

私が、使っている Python の教科書です。

柴犬はどうも動きの激しい犬は苦手ようです。相手が女の子ですがちょっと気遅れています。

最初のコード

copy

import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="こんにちは")
label.pack()
root.mainloop()

JupyterLabで実行

上のコードを JupyterLab を使って「Shift」+「Enter」で実行すると、下の画像のように「tk」というフォームが開きます。

このフォームが開いたときは赤の円のスペースがありませんので、移動は幅を広げて赤の円のスペースを作りドラッグします。

フォームのタイトル、フォームの大きさ・位置、オープン後のサイズの変更の可否をセットしてみます。

次のようなコードになります。

copy

import tkinter as tk
root = tk.Tk()

# フォームのタイトルをセットします
root.title('Code2')
# フォームのサイズ、オープンの位置をセットします
root.geometry('640x120+400+400')
# オープン後、サイズの変更の可否をセットします
root.resizable(False, False)

label = tk.Label(root, text="こんにちは")
label.pack()

root.mainloop()
title()     :タイトルを設定します。

geometry()  :ウィンドウのサイズを設定します。

resizable() :サイズを水平方向と垂直方向にそれぞれ変更できるかどうかを設定します。

ラベル(label)を修飾してみます。

copy

import tkinter as tk
root = tk.Tk()

# フォームのタイトルをセットします
root.title('Code3')
# フォームのサイズ、オープンの位置をセットします
root.geometry('640x120+400+400')
# オープン後、サイズの変更の可否をセットします
root.resizable(False, False)

label = tk.Label(
  root,
  text='こんにちは',
  font=('Meiryo 16 bold'),
  bg='blue',
  fg='#FF0'
)
label.pack()
root.mainloop()

テキストボックスを追加

VBAのフォームなどではテキスト入力ボックスと言っているものは、「Entry」という名前で1 行のテキスト用に設計された単純なテキスト入力ボックスです。

copy

import tkinter as tk
root = tk.Tk()

# フォームのタイトルをセットします
root.title('Code4')
# フォームのサイズ、オープンの位置をセットします
root.geometry('640x120+400+400')
# オープン後、サイズの変更の可否をセットします
root.resizable(False, False)

label = tk.Label(
  root,
  text='こんにちは',
  font=('Meiryo 16 bold'),
  bg='blue',
  fg='#FF0'
)
label.pack()
name_label = tk.Label(root, text='いかがお過ごしですか?')
name_label.pack()
name_inp = tk.Entry(root)
name_inp.pack()

root.mainloop()

赤枠のコードを追加しました。

その他

copy

import tkinter as tk
root = tk.Tk()

# フォームのタイトルをセットします
root.title('Code5')
# フォームのサイズ、オープンの位置をセットします
root.geometry('640x160+400+400')
# オープン後、サイズの変更の可否をセットします
root.resizable(False, False)

label = tk.Label(
  root,
  text='こんにちは',
  font=('Meiryo 16 bold'),
  bg='blue',
  fg='#FF0'
)
label.pack()
name_label = tk.Label(root, text='いかがお過ごしですか?')
name_label.pack()
name_inp = tk.Entry(root)
name_inp.pack()
other_inp = tk.Checkbutton(
  root,
  text='今日は他の人とあいさつしましたか?'
)
other_inp.pack()
num_label = tk.Label(
  root,
  text='何人とあいさつしましたか?'
)
num_label.pack()
num_inp = tk.Spinbox(root, from_=0, to=1000, increment=1)
num_inp.pack()

root.mainloop()

copy

import tkinter as tk
root = tk.Tk()

# フォームのタイトルをセットします
root.title('Code6')
# フォームのサイズ、オープンの位置をセットします
root.geometry('640x300+400+300')
# オープン後、サイズの変更の可否をセットします
root.resizable(False, False)

label = tk.Label(
  root,
  text='こんにちは',
  font=('Meiryo 16 bold'),
  bg='blue',
  fg='#FF0'
)
label.pack()
name_label = tk.Label(root, text='いかがお過ごしですか?')
name_label.pack()
name_inp = tk.Entry(root)
name_inp.pack()
other_inp = tk.Checkbutton(
  root,
  text='今日は他の人とあいさつしましたか?'
)
other_inp.pack()
num_label = tk.Label(
  root,
  text='何人とあいさつしましたか?'
)
num_label.pack()
num_inp = tk.Spinbox(root, from_=0, to=1000, increment=1)
num_inp.pack()

aisatsu_label = tk.Label(
  root, 
  text='Write a haiku about bananas'
)
aisatsu_label.pack()

aisatsu_inp = tk.Text(root, height=5)
aisatsu_inp.pack()

root.mainloop()

最終のフォーム

その他のメソッドを追加して、本日の最後のコードです。

次回は、ボタンに紐づけた関数を作成したいと考えています。

copy

import tkinter as tk
from tkinter import ttk

#############
# ウィンドウ #
#############
root = tk.Tk()

root.geometry('800x230+300+300')
root.resizable(False, False)

root.title('BackUp Application')
root.columnconfigure(0, weight=1)

variables = dict()

##################
# フォームタイトル #
##################
ttk.Label(
  root,
  text="BackUp Application",
  font=("TkDefaultFont", 16)
).grid()

#################
# ベースフレーム #
#################
drf = ttk.Frame(root)
drf.grid(padx=10, sticky=(tk.E + tk.W))
drf.columnconfigure(0, weight=1)

######################
# バックアップ元レーム #
######################
c_info = ttk.LabelFrame(drf, text='バックアップ元Folder')
c_info.grid(sticky=(tk.W + tk.E))
for i in range(3):
  c_info.columnconfigure(i, weight=1 )

variables['コピー条件'] = tk.StringVar()
ttk.Label(c_info, text='コピー条件').grid(row=2, column=0)

labframe = ttk.Frame(c_info)
for lab in ('ALL', '直下のFolderのみ', '直下のFileのみ'):
  ttk.Radiobutton(
    labframe, value=lab, text=lab, variable=variables['Lab']
).pack(side=tk.LEFT, expand=True)
labframe.grid(row=3, column=0, sticky=(tk.W + tk.E))

variables['バックアップ元'] = tk.StringVar()
ttk.Label(c_info, text='バックアップ元').grid(row=2, column=1)
tk.Entry(
  c_info, textvariable=variables['バックアップ元'], width=65
).grid(row=3, column=1, sticky=(tk.W + tk.E))

ttk.Button(
  c_info,
  command='',
  text='参照',
  default='active'
).grid(row=3, column=2, sticky=(tk.W + tk.E))

variables['Lab'] = tk.StringVar()
ttk.Label(c_info, text='').grid(row=4, column=0)

######################
# バックアップ先レーム #
######################
p_info = ttk.LabelFrame(drf, text='バックアップ先Folder')
p_info.grid(sticky=(tk.W + tk.E))
for i in range(3):
  p_info.columnconfigure(i, weight=1 )

variables['貼り付け条件'] = tk.StringVar()
ttk.Label(p_info, text='貼り付け条件').grid(row=5, column=0)

labframe = ttk.Frame(p_info)
for lab in ('直下のFolderを維持', '直下のFolderを統合'):
  ttk.Radiobutton(
    labframe, value=lab, text=lab, variable=variables['Lab']
).pack(side=tk.LEFT, expand=True)
labframe.grid(row=6, column=0, sticky=(tk.W + tk.E))

variables['バックアップ先'] = tk.StringVar()
ttk.Label(p_info, text='バックアップ先').grid(row=5, column=1)
tk.Entry(
  p_info, textvariable=variables['バックアップ先'], width=65
).grid(row=6, column=1, sticky=(tk.W + tk.E))

ttk.Button(
  p_info,
  command='',
  text='参照',
  default='active'
).grid(row=6, column=2, sticky=(tk.W + tk.E))

variables['Lab'] = tk.StringVar()
ttk.Label(p_info, text='').grid(row=7, column=0)

########################
# 実行・キャンセルボタン #
########################
buttons = ttk.Frame(drf)
buttons.grid(sticky=tk.E + tk.W)
exec_button = ttk.Button(buttons, command='', text='実行')
exec_button.pack(side=tk.RIGHT)

cancel_button = ttk.Button(buttons, command='', text='キャンセル')
cancel_button.pack(side=tk.RIGHT)

root.mainloop()

上のコードを実行すると次のようなフォームが開きます。

本日ここまでとします。