カテゴリー

Python基礎

【文字入力&グラフに反映】inputとtkinterでグラフに任意の文字を反映

2021年10月13日

こんな人にオススメ

グラフを作成するときに毎回、違うグラフタイトルとかを付けないといけない。

けど、毎回コードから修正するのは面倒。どうしたらいい?

ということで、今回はinput関数とtkinterを使用して、グラフタイトルとかをポップアップとかで入力してからグラフを作成する方法を解説する。

執筆者自身、研究で使うプログラムで実行するたびにどの条件なのかをグラフに示しておきたいということがあった。

今回はこの状況の簡単版として、グラフタイトルとかをコードの実行開始後にユーザーが入力してから、その結果をグラフに反映する方法を解説する。

python環境は以下。

  • Python 3.9.7
  • matplotlib 3.4.3
スポンサーリンク
スポンサーリンク

運営者のメガネです。TwitterInstagramも運営してます。

自己紹介はこちらから、お問い合わせはこちら。

運営者メガネ

作成したコード全文

下準備

import matplotlib.pyplot as plt
import tkinter as tk

x = [0, 1, 2]
y = [0, 2, 1]

まずは下準備としてのimport関連。今回は使うライブラリが少なめ。tkinterはpythonの標準ライブラリなのでpythonをインストールしたら入ってると思う。

tkinter自体はGUIを作成できる、つまりポップアップ的な感じで文字入力とかボタンとかを配置できるというもの。以下の画像の左上のウィンドウが一例。

サイズとか色とかカスタムができるし、OSによっても見た目が随分と異なるため、あくまでもイメージとして捉えていただければと思う。以下の画像のOSはmacOS。

関数の引数に入力文字を入れる

今回はグラフを描きたいわけだが、そのための関数をまずは紹介。シンプルにxyでグラフ化している。

関数の引数でグラフタイトル、横軸ラベル、縦軸ラベル、そしてグラフの保存名を決めている。

def graph(title, xlabel, ylabel, save_name):
    fig, ax = plt.subplots(1, 1)
    ax.set_title(title)  # タイトル
    ax.set_xlabel(xlabel)  # 横軸ラベル
    ax.set_ylabel(ylabel)  # 縦軸ラベル
    ax.plot(x, y)

    # fig.savefig(save_name)
    plt.show()

この関数を呼び出す場合は以下のように関数に引数を入れたらいいけど、これだと毎回コードをいじらないといけない。面倒。

# 毎回コードに打たないといけない
graph(title='title', xlabel='xlabel', ylabel='ylabel', save_name='func')

この引数を今回はコード実行時に指定できるようにする。

input関数でターミナル上に表示

def ask_input():
    ans = []
    title = input('グラフタイトルを入力: ')
    xlabel = input('横軸ラベルを入力: ')
    ylabel = input('縦軸ラベルを入力: ')

    ans = {
        'title': title,
        'xlabel': xlabel,
        'ylabel': ylabel,
    }

    return ans

まずは王道のinput関数を使用する方法。ターミナル上に文字入力をして、それを使ってタイトルとかを指定する。

input()だけでも使用する事は可能だが、その場合はターミナル上に何も文字が出ず、止まっているのか文字が出ていないのかがわかりにくい。

返り値のansでタイトルとラベルを返し、それを使ってグラフを作成したのが以下。

# コンソール(ターミナル)上で入力が求められる
ans = ask_input()
title = ans['title']
xlabel = ans['xlabel']
ylabel = ans['ylabel']
graph(title=title, xlabel=xlabel, ylabel=ylabel, save_name='input')

例えば、以下のようにターミナルで指定すると、その通りにグラフが作成される。

tkinterでテキストボックスを作成

# テキストボックスに何を入れるのかを示すためのラベル
def label(x, y, text):
    label = tk.Label(text=text)
    label.place(x=x, y=y)

# テキストボックス作成
def textbox(x, y, text):
    # ラベルを表示
    label(x=x - 30, y=y, text=text)  # -30だとx=0が左端に来た

    text = tk.StringVar()  # 文字列を入れるためのウィジェット
    tk.Entry(textvariable=text).pack()  # テキストボックスを配置

    return text

input関数を使用する方法でもいいんだけど、入力画面がダサめ。という事でGUIであるtkinterを使用する方法を解説。

tkinterを使用したウィンドウの例は既に出したが、ここではあれを作成する。あのウィンドウに入力したタイトルと軸ラベルがそのままグラフに反映される。

上のlabel関数がどのテキストボックスがどの入力に対応するかを、textbox関数がグラフに反映させるテキストボックスを示している。

本当は色々と設定できる項目があるけど、とりあえず表示と簡単なレイアウトは上記でいける。使用しているOSやディスプレイ設定などで若干、表示が崩れるかもしれないけど、その時は適宜調節してほしい。

これら2つの関数を使用して、入力値をグラフに反映させる関数が以下。やってることは基本はinput関数の時と同じ。

# テキストボックスを配置し、GUIで表示
def get_inputtext():
    root = tk.Tk()  # ウィンドウを作成
    root.geometry('300x200')  # 画面全体のサイズを指定
    root.title('タイトル、横・縦軸ラベルを入力')  # 画面のタイトル

    # グラフタイトル、横・縦軸ラベルを配置
    title = textbox(x=30, y=0, text='title')
    xlabel = textbox(x=30, y=30, text='xlabel')
    ylabel = textbox(x=30, y=60, text='ylabel')

    # 入力決定ボタンを配置
    tk.Button(text='決定', width=8, command=root.destroy).pack()
    root.mainloop()

    # 入力結果は辞書にまとめる
    ans = {
        'title': title.get(),
        'xlabel': xlabel.get(),
        'ylabel': ylabel.get(),
    }

    return ans

この関数を使用して以下のように入力した時のグラフを作成。

ちゃんと意図した通りにグラフかできた。

執筆者は使わなかった

今回はコード実行ごとにユーザーに入力を求め、その入力をグラフに反映させる方法について解説した。

確かに多くの測定データを複数人で同じコードで回す際にはこの方法は良いかもしれない。実際、研究室ではtkinterを使用してコードを作成している先輩もいた。

しかし、執筆者の研究では正直あまり使う事はなかった。なぜか。面倒だから。一回やってみて、毎回ポップアップが出るのが面倒。

自分自身・チームで最適な手法を検討していただければと思う。

関連記事

【python&~】数値にチルダ(~)をつけると値が+1されて負の数になる(ビット反転)

続きを見る

【plotly&ボタン】グラフに複数種のボタンを追加

続きを見る

【plotly&コッホ曲線】フラクタル図形の雪の結晶をスライダーで作成してみる

続きを見る

【辞書の結合】dictのマージ

続きを見る

関連コンテンツ

スポンサーリンク

Amazonのお買い物で損したない人へ

1回のチャージ金額通常会員プライム会員
¥90,000〜2.0%2.5%
¥40,000〜1.5%2.0%
¥20,000〜1.0%1.5%
¥5,000〜0.5%1.0%

Amazonギフト券にチャージすることでお得にお買い物できる。通常のAmazon会員なら最大2.0%、プライム会員なら2.5%還元なのでバカにならない。

ゲットしたポイントは通常のAmazonでのお買い物に使えるからお得だ。一度チャージしてしまえば、好きなタイミングでお買いものできる。

なお、有効期限は10年だから安心だ。いつでも気軽にAmazonでお買い物できる。

Amazonチャージはここから出来るで

もっとお得なAmazon Prime会員はこちらから

30日間無料登録

執筆者も便利に使わせてもらってる

スポンサーリンク

  • この記事を書いた人

メガネ

独学でpythonを学び天文学系の大学院を修了。 ガジェット好きでMac×Android使い。色んなスマホやイヤホンを購入したいけどお金がなさすぎて困窮中。 元々、人見知りで根暗だったけど、人生楽しもうと思って良い方向に狂ったために今も人生めちゃくちゃ楽しい。 pythonとガジェットをメインにブログを書いていますので、興味を持たれましたらちょこちょこ訪問してくだされば幸いです🥰。 自己紹介→変わって楽しいの繰り返し

-Python基礎
-, ,