カテゴリー

当サイトはアフィリエイトプログラムによる収益を得ています〈景品表示法に基づく表記です)

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

続きを見る

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

続きを見る

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

続きを見る

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

続きを見る

ガジェット

2023/9/18

【デスクツアー2022下半期】モノは少なく、でも効率的に Desk Updating #0

今回はガジェットブロガーなのにデスク環境を構築していない執筆者の ...

ライフハック

2023/9/16

【Audible vs YouTube Premium】耳で聴く音声学習コンテンツを比較

ワイヤレスイヤホンが普及し耳で学習することへのハードルが格段に下 ...

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

2023/9/18

【SENNHEISER MOMENTUM True Wireless 3レビュー】全てが整ったイヤホン

今回は高音質・高機能なSENNHEISERのフラグシップ完全ワイヤレスイヤホン「SENNH ...

ライフハック

2023/3/11

【YouTube Premiumとは】メリットしかないから全員入れ

今回はYouTube Premiumを実際に使ってみてどうなのか、どんなメリット/デメリット ...

マウス

2023/8/17

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

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

ベストバイ

2023/9/18

【ベストバイ2022】今年買って良かったモノのトップ10

2022年ベストバイ この1年を振り返って執筆者は何を買ったのか。ガジェッ& ...

スマホ

2023/1/15

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

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

マウス

2023/9/16

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

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

macOSアプリケーション

2022/9/30

【Chrome拡張機能】便利で効率的に作業できるおすすめの拡張機能を18個紹介する

こんな人におすすめ Chromeの拡張機能を入れたいけど、調べても同じような ...

macOSアプリケーション

2023/5/3

【Automator活用術】Macで生産性を上げる作業の自動化術

今回はMacに標準でインストールされているアプリ「Automator」を使ってできる ...

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

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

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

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

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

  • この記事を書いた人

メガネ

Webエンジニア駆け出し。独学のPythonで天文学系の大学院を修了。常時金欠のガジェット好きでM2 Pro MacBook Pro(30万円) x Galaxy S22 Ultra(17万円)使いの狂人。自己紹介と半生→変わって楽しいの繰り返しレビュー依頼など→お問い合わせ運営者情報、TwitterX@m_ten_pa、 YouTube@megatenpa、 Threads@megatenpa

-Python基礎
-, ,