質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

1回答

785閲覧

Spinboxで設定した値をグラフに表示させる方法について

Jun1212

総合スコア0

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2023/04/01 11:15

GUI上のSpinboxで設定したX、Yの値を同一Gui上のグラフにプロットしたいと思っています。
(Xは時間、Yは温度で温度プロフィール的なイメージになります。)

GUIは4フレームで構成されており、各フレームで別ファイルで作成しています。

frame2.pyは温度用Spinboxが6個、時間用Spinboxが6個とSetボタンを配置しており、Setボタンを押すことでSpinboxの値をリストの格納したいと思っています。

frame3.pyでは、frame2で作成したリストを読み込みmatplotlibでグラフに描写したいと思っています。

ここ最近、Pythonを学び始めた初心者で何かしらアドバイスなどご教示頂ければ幸いです。

該当のソースコード

frame2.py

1import customtkinter 2import tkinter as tk 3import frame3 4 5class ReadFileFrame2(customtkinter.CTkFrame): 6 def __init__(self, *args, header_name="ReadFileFrame2", **kwargs): 7 super().__init__(*args, **kwargs) 8 self.header_name = header_name 9 self.setup_form2() 10 11 def setup_form2(self): 12 self.spinboxt1c = tk.Spinbox(master=self) 13 self.spinboxt1c.grid() 14 15 self.spinboxt1s = tk.Spinbox(master=self) 16 self.spinboxt1s.grid() 17 18 19 #一部省略 20 21 22 self.spinboxt6c = tk.Spinbox(master=self) 23 self.spinboxt6c.grid() 24 25 self.spinboxt6s = tk.Spinbox(master=self) 26 self.spinboxt6s.grid() 27 28 self.setpb1 = customtkinter.CTkButton(master=self, command=self.get_values_temp) 29 self.setpb1.grid() 30 31 def get_values_temp(self): 32 33 y_1 = self.spinboxt1c.get() 34 y_2 = self.spinboxt2c.get() 35 y_3 = self.spinboxt3c.get() 36 y_4 = self.spinboxt4c.get() 37 y_5 = self.spinboxt5c.get() 38 y_6 = self.spinboxt6c.get() 39 40 x_1 = self.spinboxt1s.get() 41 x_2 = self.spinboxt2s.get() 42 x_3 = self.spinboxt3s.get() 43 x_4 = self.spinboxt4s.get() 44 x_5 = self.spinboxt5s.get() 45 x_6 = self.spinboxt6s.get() 46 47 global y_list 48 global x_list 49 50 y_list = [0, y_1, y_2, y_3, y_4, y_5, y_6] 51 x_list = [0, x_1, x_2, x_3, x_4, x_5, x_6] 52 53 global frame3 54 frame3 = frame3.ReadFileFrame3(master=self.master, x_list=x_list, y_list=y_list)

frame3.py

1import customtkinter 2import tkinter as tk 3import matplotlib.pyplot as plt 4from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk 5from matplotlib.figure import Figure 6import numpy as np 7import frame2 8 9class ReadFileFrame3(customtkinter.CTkFrame): 10 def __init__(self, *args, header_name="ReadFileFrame3", x_list=None, y_list=None, **kwargs): 11 super().__init__(*args, **kwargs) 12 self.header_name = header_name 13 self.x_list = x_list 14 self.y_list = y_list 15 self.setup_form3() 16 17 def setup_form3(self): 18 fig = Figure(figsize=(5, 6)) 19 20 self.ax = fig.add_subplot(1, 1, 1) 21 self.ax.set_ylabel("Temp[℃]") 22 self.ax.set_xlabel("Time[Sec]") 23 24 self.fig_canvas = FigureCanvasTkAgg(fig, self) 25 self.fig_canvas.get_tk_widget().pack() 26 27 # Use the values of x_list and y_list passed as arguments to the constructor 28 if self.x_list is not None and self.y_list is not None: 29 self.ax.plot(self.x_list, self.y_list) 30 31 self.fig_canvas.draw()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teamikl

2023/04/01 18:09 編集

具体的にどこで躓いていますか? 現状のコードでは、frame3のpack/grid が呼ばれていませんが、 省略されているのかどうかが判断できません。 コードが長くなる場合は、問題の部分を簡素にする等の工夫をして 質問には実行可能なコードを掲載してください。 (例えば、スピンボックス1つにして、別フレームのグラフに反映させる等)
guest

回答1

0

frame2 / frame3 が相互にインポートしている

frame2 内で frame3 をインポートして、
frame3 内でも frame2 をインポートしている。
循環インポートという問題を引き起こします。

今回の場合は、frame2 内で frame3 をインポートだけでよいはずです。

  • global frame3 は不要です。global 宣言は、変数を上書きする際に使います。

 ここの解決策としては、変数名とモジュール名を被らせないようにしましょう。

frame3 のレイアウトが呼ばれていない

pack/grid を呼び出して、配置します。

Frame 生成時にプロットするデータのリストを渡している

Frame 生成時にプロットするデータを渡し、グラフを生成しているため
スピンボックスの値の変更に対して、データを変更するには
フレームの再生成(前のグラフを破棄して、新しいフレームを生成)が必要になります。

この点を改善(スピンボックスの値の変化をリアルタイムにグラフへ反映)するには、
初期値のリストとは別に、リストを渡してグラフを再プロットするメソッドを frame3 側に実装します。

投稿2023/04/01 19:04

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問