カテゴリー

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で数値にチルダ~をつけてみると出力が-((数値)+1)になって& ...

続きを見る

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

こんな人にオススメ plotlyってグラフの切り替えとかできるボタンをつけられるけど、{ ...

続きを見る

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

こんな人にオススメ 雪の結晶ってフラクタル図形の一種でキレイなのは知ってるけ ...

続きを見る

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

こんな人にオススメlistは+記号で配列の足し算(結合)ができるけど、dictってどうすれ ...

続きを見る

スマホ

2023/1/21

【Galaxy S22 Ultraレビュー】これが最高峰

こんな人におすすめ 2022年最強のスマホGalaxy S22 Ultraって実際使った感じどうなの ...

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

2023/1/15

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

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

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

2023/1/14

【SONY WF-1000XM4 vs SENNHEISER MTW3】MTW3を選んだ決定的な3つの理由

こんな人におすすめ 執筆者は「SONY WF-1000XM4」「SENNHEISER MOMENTUM True Wireless 3」両方を持っている ...

スマホ

2023/1/15

【楽天モバイル×povo2.0の併用】月1,000円の保険付きデュアルSIM運用

こんな人におすすめ 楽天モバイルとpovo2.0のデュアルSIM運用って実際のとこ ...

マウス

2023/1/5

【Logicool MX ERGOレビュー】疲れない作業効率重視トラックボールマウス

こんな人におすすめ トラックボールマウスの王道Logicool MX ERGOが気になるけどऩ ...

マウス

2023/1/14

【Logicool MX ERGOカスタム】Logi Optionsのジェスチャーボタン設定内容

こんな人におすすめ Logicool MX ERGOをもっと上手に効率的に使いこなしたい。 ボ| ...

生活に役立つ

2023/1/8

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

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

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

2023/1/15

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

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

スイッチボット

2023/1/14

【SwitchBot Hub Mini】アプリにないエアコンなどの家電をその他で登録する方法

こんな人におすすめSwitchBot Hub Miniに我が家のエアコンを登録したいけど、SwitchBotア ...

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

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

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

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

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

  • この記事を書いた人

メガネ

ベンチャー企業のWebエンジニア駆け出し。独学のPythonで天文学系の大学院を修了→新卒を1.5年で辞める→転職→今に至る。
常時金欠のガジェット好きでM1 MacBook Pro x Galaxy S22 Ultraの狂人。

自己紹介と半生→変わって楽しいの繰り返し レビュー依頼などお問い合わせ Twitter@m_ten_pa

-Python基礎
-, ,