Python で Tkinter を使ってみる1
柴犬は気温が下がり気分がよくなったのかキリっとした顔になりました。
概要
前回、エクセルでバックアップを考えました。
それを Python の Tkinter を使ってフォームでするとどうなるか試してみました。
自分の力量でも何とかフォームを作るところまでできましたので記録します。
作ったフォームの画像です。
私が、使っている Python の教科書です。
技術評論社 Eric Matthes(著) 鈴木たかのり(訳) 安田 善一郎(訳)
2023年9月25日現在
技術評論社 Eric Matthes(著) 鈴木たかのり(訳) 安田 善一郎(訳)
2023年9月25日現在
柴犬はどうも動きの激しい犬は苦手ようです。相手が女の子ですがちょっと気遅れています。
最初のコード
import tkinter as tk root = tk.Tk() label = tk.Label(root, text="こんにちは") label.pack() root.mainloop()
JupyterLabで実行
上のコードを JupyterLab を使って「Shift」+「Enter」で実行すると、下の画像のように「tk」というフォームが開きます。
このフォームが開いたときは赤の円のスペースがありませんので、移動は幅を広げて赤の円のスペースを作りドラッグします。
フォームのタイトル、フォームの大きさ・位置、オープン後のサイズの変更の可否をセットしてみます。
次のようなコードになります。
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)を修飾してみます。
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 行のテキスト用に設計された単純なテキスト入力ボックスです。
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()
赤枠のコードを追加しました。
その他
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()
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()
最終のフォーム
その他のメソッドを追加して、本日の最後のコードです。
次回は、ボタンに紐づけた関数を作成したいと考えています。
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()
上のコードを実行すると次のようなフォームが開きます。
本日ここまでとします。