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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

解決済

tkinterの画面上に表示したグラフを更新するとテキストボックスのスクロールがかくつく

intnto
intnto

総合スコア1

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

1回答

1リアクション

0クリップ

303閲覧

投稿2022/08/08 16:15

編集2022/08/09 11:22

前提

●開発環境
・Python 3.10.2
┗(ライブラリ)matplotlib Version: 3.3.4
┗(ライブラリ)tkinter Version: 8.6.6
・OS:Windows10 64bit

tkinterで作成した同一画面上に
・自動スクロールするテキストボックス(TkinterのTextウィジェットを継承して作成した独自のウィジェット)を10個
・matplotlibで作成したグラフを10枚
を表示するアプリを作成しています。

実現したいこと

tkinterとmatplotlibを用いて
・各テキストボックスにそれぞれ異なる1文字以上の文字列を表示する
・テキストボックスは常に一定速度で自動スクロールする
・各グラフは一定時間毎に同じタイミングで画面更新する
という動作をかくつくことなく実現させたいです。
可能でしょうか?
可能であれば該当のソースコードをどのように修正すればよいか教えてください。

発生している問題・エラーメッセージ

グラフが更新するタイミングでテキストボックスのスクロール動作がかくつきます

該当のソースコード

python

import tkinter as tk from tkinter import Text import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg class Sample(tk.Tk): def __init__(self, aGraphNum, aTextBarNum): """_summary_ Args: aGraphNum (int): 表示するグラフの数(1以上) aTextBarNum (int): 表示するスクロールバーの数(1以上) """ super().__init__() # グラフ self.__mGraph = Graph(self,aGraphNum) # テキストバー self.__mTxtB = TextBar(self,aTextBarNum) # Threadによる画面更新 self.__mGraphUpdIntvl = 5000 self.__mGraphUpdCnt = 0 # tk.Tk.after()による画面更新 self.__mTextUpdIntvl = 50 self.after(self.__mTextUpdIntvl,self.__AfterFnc) def __AfterFnc(self): """_summary_ after()による画面更新 """ self.__mTxtB.updScreen() self.__mGraphUpdCnt = self.__mGraphUpdCnt + self.__mTextUpdIntvl if self.__mGraphUpdCnt % self.__mGraphUpdIntvl == 0: self.__mGraphUpdCnt = 0 self.__mGraph.updScreen() self.after(self.__mTextUpdIntvl,self.__AfterFnc) class Graph(tk.Frame): """_summary_ グラフ領域管理 """ def __init__(self, aMaster, aGraphNum): super().__init__(master=aMaster) self.__mFig = plt.figure() self.__mAxes = [] for tNum in range(aGraphNum): # グラフ生成 self.__mAxes.append(self.__mFig.add_subplot(1,aGraphNum,tNum+1)) # グラフをtkinterに表示 self.__mCanvas = FigureCanvasTkAgg(self.__mFig, self) self.__mCanvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) self.pack() def updScreen(self): """_summary_ グラフを更新する """ self.__mCanvas.draw_idle() class TextBar(tk.Frame): """_summary_ スクロール表示領域管理 """ def __init__(self, aMaster, aTextBarNum): super().__init__(master=aMaster) # 表示領域作成 self.__mCanvas = tk.Canvas(self.master) self.__mText = [] for tNum in range(aTextBarNum): # スクロールバー生成 self.__mText.append(Custom_Text(0,(tNum)*20,self.__mCanvas)) self.__mText[tNum].insert("1.0","abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz") self.__mCanvas.pack() def updScreen(self): """_summary_ スクロールする """ for tTxt in self.__mText: tViewSE = tTxt.xview() tIntv = 0.005 tPos:float = tViewSE[0] + tIntv if tViewSE[1] >= 1: # 最後尾なら先頭に戻る tPos = 0.0 elif tViewSE[1] + tIntv >= 1.0: # 1以上なら最後尾に移動する tPos = 1.0 tTxt.xview_moveto(tPos) class Custom_Text(Text): """_summary_ テキストボックス """ def __init__(self, aX, aY, aMaster=None): Text.__init__(self, aMaster,width=10,height=1,wrap=tk.NONE) self.place(x=aX, y=aY) if __name__ == "__main__": tSmpl = Sample(10,10) tSmpl.mainloop()

試したこと

・グラフ(Graph)またはテキストボックス(TextBar)をSampleクラス内に配置したThreadとtk.Tk.after()により更新していたが、tk.Tk.after()でのみ更新するよう変更しました。
⇒グラフ更新のタイミングでカクつき、変更前から変化なし

teamikl👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

slemntqe

2022/08/09 01:54

動作するのが重くなる、動きがスムーズではない、うごきがかくかくするという意味であれば「角つく」という表記は利用しません。「かくつく」「カクつく」といった表記をします。「角つく」と表記されると角張ったような表示がされている印象を受けます。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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