見出し画像

Tkinterやってみる(4)


Tkinter変数

Udemyの動画教材のうち

Tkinter basicsの3本目Tkinter変数のデモ動画の中に、一行入力に文字列を入力すると、その場で別のラベルウィジェットの表示内容もその内容にあわせて変わる、というふうに「シンクロ」しているようなデモがあります。結果を求める際にボタンをクリックさせるより、なんだかカッコいい。

前回の

で作った、「トイチ」ならぬ10日で5割のこのプログラム

ですけど「Tkinter変数」を使ったら、元金、利率、日数をTkinter変数にしておいて、「内容変更があった場合に即座に結果を更新する」といったこともできそう。つまり、「計算」のボタン要らなくなるんじゃない?と思い、試してみました。

Tkinter変数の「変化」の検出

Tkinter変数の「変更」を検出するには・・・
Copilot先生に聞いてみたところ、trace_addメソッドを使うとのこと。例えばstring_var.trace_add("write", button_calc) と書いておけば、変数string_varに変更があったときにbutton_calc関数が呼び出される。

やってみました。

import tkinter as tk
from tkinter import ttk

def button_calc(*args):
    label_kekka['text'] = "エラーです。入力を見直して"
    gankin = int(gankin_strvar.get())
    riritsu = float(entry_riritsu.get())
    nissu = int(entry_nissu.get())
    kekka = gankin * pow(1.0+riritsu/10.0, (nissu-1)//10)
    label_kekka['text'] = round(kekka)    

window = tk.Tk()
window.title("利子計算ツール")
window.geometry("300x300")

#Tkinter変数 gankin_strvar riritsu_strvar nissu_strvar
gankin_strvar = tk.StringVar()
gankin_strvar.trace_add("write", button_calc)

riritsu_strvar = tk.StringVar()
riritsu_strvar.trace_add("write", button_calc)

nissu_strvar = tk.StringVar()
nissu_strvar.trace_add("write", button_calc)

#元金
label_gankin_h = ttk.Label(master = window, text = "元金")
label_gankin_h.pack()
entry_gankin = ttk.Entry(master = window, textvariable = gankin_strvar)
entry_gankin.pack()
label_gankin_f = ttk.Label(master = window, text = "円")
label_gankin_f.pack()

#利率
label_riritsu_h = ttk.Label(master = window, text = "利率")
label_riritsu_h.pack()
entry_riritsu = ttk.Entry(master = window, textvariable = riritsu_strvar)
entry_riritsu.pack()
label_riritsu_f = ttk.Label(master = window, text = "割/10日")
label_riritsu_f.pack()

#日数
label_nissu_h = ttk.Label(master = window, text = "日数")
label_nissu_h.pack()
entry_nissu = ttk.Entry(master = window, textvariable = nissu_strvar)
entry_nissu.pack()
label_nissu_f = ttk.Label(master = window, text = "日")
label_nissu_f.pack()

#計算
#button = ttk.Button(master = window, text = "計算", command = button_calc)
#button.pack()

#結果
label_kekka_h = ttk.Label(master = window, text = "結果")
label_kekka_h.pack()
label_kekka = ttk.Label(master = window, text = " ")
label_kekka.pack()
label_kekka_f = ttk.Label(master = window, text = "円")
label_kekka_f.pack()

#mainloop
window.mainloop()

「計算」ボタンはコメントアウト。元金、利率、日数のEntryに変更があるとbutton_calc()を呼び出す。途中でエラーになった場合は、"エラーです。入力を見直して"という文字列が、結果の金額のかわりに表示される。

実行

起動

入力

正しい入力

期待通りになりました。

(余談:マルチカーソル機能)

 Udemy動画のデモの中で、エディタで複数行で共通の内容を同時に一ぺんに入力している操作デモがありました。「マルチカーソル機能」というらしい。VSCの場合、Altキーを押しながら入力したい行をクリックすることで複数カーソルが表示され、複数個所同時に入力できる。これは便利そうです。


いいなと思ったら応援しよう!