カテゴリー

Python基礎

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

2021年10月13日

こんな人にオススメ

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

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

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

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

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

python環境は以下。

  • Python 3.9.7
  • matplotlib 3.4.3

運営者のメガネとです。YouTubeTwitterInstagramも運営中。

自己紹介はこちらから、お問い合わせはこちらからお願いいたします。

運営者メガネ

作成したコード全文

下準備

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されて負の数になる(ビット反転)

こんな人にオススメ pythonで数Í ...

続きを見る

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

こんな人にオススメ plotlyって| ...

続きを見る

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

こんな人にオススメ 雪の結 ...

続きを見る

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

こんな人にオススメlistは+記号 ...

続きを見る

スイッチボット

2022/11/28

【SwitchBotロックレビュー】これからのスタンダードになりうるスマートロック

こんな人にオススメ SwitchBotからスマートロック「SwitchBotロック」が発売された ...

生活に役立つ

2022/11/28

【メガネ厳選】クソ便利に使っているサービスやアイテム達

このページでは執筆者「メガネ」が実際に使って便利だと感じているサ ...

マウス

2022/9/11

【Logicool MX ERGO vs MX Master 3】ERGOをメインにした決定的な理由

こんな疑問・お悩みを持っている人におすすめ 執筆者はLogicoolのハイエンӠ ...

完全ワイヤレスイヤホン(TWS)

2022/11/21

【ながら聴きイヤホン比較】SONY LinkBuds、ambie、BoCoはどれがおすすめ?

こんな人におすすめ 耳を塞がない開放型のイヤホンに完全ワイヤレスӟ ...

macOSアプリケーション

2022/10/15

【M1 Mac】MacBook Proに入れている便利でニッチなアプリを21個紹介する

こんな人におすすめ MacBookを購入してLINEとか必要最低限のアプリは入れた。 ...

完全ワイヤレスイヤホン(TWS)

2022/10/23

【SENNHEISER MOMENTUM True Wireless 3レビュー】高レベルでバランス型の高音質イヤホン

こんな人におすすめ SENNHEISER MOMENTUM True Wireless 3って実際のところどうなの? 評判は良い ...

完全ワイヤレスイヤホン(TWS)

2022/11/21

【SONY WF-1000XM4レビュー】神とゴミのハーフ&ハーフ

こんな人におすすめ SONYのフラグシップモデル「SONY WF-1000XM4」ってどれくらい性 ...

完全ワイヤレスイヤホン(TWS)

2022/8/19

【Nothing ear (1)レビュー】ライトな完成度、アップデートに期待

こんな人にオススメ 完全ワイヤレスイヤホン(TWS)でスケルトンボディ ...

Pythonを学びたいけど独学できる時間なんてない人へのすゝめ

執筆者は大学の研究室・大学院にて独学でPythonを習得した。

でも社会人になったら独学で行うには時間も体力もなくて大変だ。

時間がない社会人だからこそプロの教えを乞うのが効率的。

ここでは色んなタイプに合ったプログラミングスクールの紹介をする。

  • この記事を書いた人

メガネ

ベンチャー企業のWebエンジニア駆け出し。独学のPythonで天文学系の大学院を修了→新卒を1.5年で辞める→転職→今に至る。
常時金欠のガジェット好きでM1 MacBook Pro x Galaxy S22 Ultraの狂人。
人見知りで根暗だったけど、人生楽しもうと思って良い方向に狂う→人生が楽しい

ガジェットのレビューとPythonコードを記事にしています。ぜひ楽しんでください🦊
自己紹介と半生→変わって楽しいの繰り返し

-Python基礎
-, ,