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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2921閲覧

Python,Tkinterを使用したソフトを長時間連続稼働すると表示がおかしくなる。

namapasuta

総合スコア0

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/01/05 15:06

編集2022/01/06 11:17

PythonとTkinterをつかい、GUIアプリケーションを作っています。
下記コードを約1時間以上実行し続けたとき、おかしな位置(画面左上)に時刻表示やその他オブジェクトがすべてずれ、一切の入力を受け付けなくなった後、仕方なくソフトを閉じようとすると「動作を停止しました」と表示されソフトが落ちてしまいます。
原因と改善点を知りたいです。

#追記
VisualStudioCodeのターミナルに「Failed to create the menu window」と表示され、処理が止まり表示がバグっています。表示がおかしくなるだけで時計自体は動いている(ラベルは更新され続けている)状態です。

#コード

Python

1 2from os import access 3import tkinter 4from tkinter import ttk 5from tkinter import filedialog 6from tkinter import messagebox 7import sys 8import tkinter.font 9import datetime 10import time 11import threading 12import pyglet,tkinter 13import json 14pyglet.font.add_file('Fonts\SoukouMincho.ttf') 15pyglet.font.add_file('Fonts\DSEG7Classic-Bold.ttf') 16import configparser 17 18def get_time(): 19 20 while True: 21 22 now = datetime.datetime.now() 23 24 25 tm = "{:02}".format(now.hour) 26 tm2 = "{:02}".format(now.minute) 27 global programpt 28 json_open = open( programpt , 'r') 29 json_load = json.load(json_open) 30 now = datetime.datetime.now() 31 tmall = ("{:02}""{:02}").format(now.hour,now.minute) 32 a =json_load["Program"]["Etimet"+str(nm3)] 33 b =json_load["Program"]["Etimeo"+str(nm3)] 34 ab = (a)+(b) 35 timedelta = int(tmall) - int(ab) 36 37 if timedelta > 0: 38 delay_label = ttk.Label(delay_frm, text="遅延あり" ,font=("SoukouMincho", "80",) ,foreground="red" ,background="#000000") 39 else: 40 delay_label = ttk.Label(delay_frm, text="遅延なし" ,font=("SoukouMincho", "80",) ,foreground="green" ,background="#000000") 41 42 delay_label.grid(column=0, row=0,sticky=tkinter.W,) 43 44 45 46 time_label = ttk.Label(time_frm, text=tm + ":" + tm2, font=("DSEG7 Classic",200) ,foreground="orange2",background="#000000") 47 time_label.grid(column=0, row=1,sticky=tkinter.SW,pady=10) 48 time2_label = ttk.Label(time_frm, text="現在時刻", font=("SoukouMincho",40,) ,foreground="orange2",background="#000000") 49 time2_label.grid(column=0, row=0 ,sticky=tkinter.W , pady=10) 50 51 52 time.sleep(1) 53 54main_win = tkinter.Tk() 55main_win.title("メインウインドウ") 56main_win.attributes('-fullscreen', True) 57main_win.configure(bg='#000000') 58 59 60ttk.Style().configure("TP.TFrame", background="brack") 61 62main_frm = ttk.Frame(main_win ,width=1480, height=2000,style="TP.TFrame") 63main_frm.grid(column=0,row=0, sticky=tkinter.NS, padx=10, pady=10) 64 65time_frm = ttk.Frame(main_frm,width=1480, height=400,style="TP.TFrame") 66time_frm.grid(column=0,row=1, rowspan=2, sticky=tkinter.W, padx=0, pady=0 ,columnspan=5) 67time_frm.grid_propagate(0) 68 69delay_frm = ttk.Frame(main2_frm, width=450, height=200 ,style="TP.TFrame") 70delay_frm.grid(column=0,row=1, padx=10, pady=10) 71delay_frm.grid_propagate(0)

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

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

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

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

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

melian

2022/01/05 15:39

get_time() 関数は実際に使われていますか? 気になるのは get_time() の中に while ループがあって、その中でファイルオープンしているのですけれどもクローズ処理が行われていません。 while True: : json_open = open( programpt , 'r') ファイル内容が変更されないのであれば、以下の部分はループの外側に出す方が良いかと思います(nm3 の定義場所が不明ですが)。 global programpt json_open = open( programpt , 'r') json_load = json.load(json_open) a =json_load["Program"]["Etimet"+str(nm3)] b =json_load["Program"]["Etimeo"+str(nm3)] ab = (a)+(b) その際は with clause で with open(programpt, 'r'): ... とするなど。
namapasuta

2022/01/06 11:14

該当の個所を外に出しソフトを動作させてみたのですが、やはり1時間かからず表示がバグってしまいます。 時計は最初動作させ始めた段階では問題なく動くのでget_time関数は動いています。
teamikl

2022/02/06 10:34

get_time 関数を利用する、問題が再現できるコードを掲載してください。 ファイルに関してはデストラクタでのクローズが期待できるので問題ありません。 長時間使っていて問題に関しては、ウィジェットを毎回新規生成している点が問題です。
guest

回答1

0

長時間使っていて問題に関しては、ウィジェットを毎回新規生成している点が問題です。

get_time() で ttk.Label ウィジェットを毎回新規作成してるので、使用メモリが増え続けます。

問題の確認方法: get_time 関数の末尾辺りで

python

1print(time_label)

としてみてください。ウィジェットのIDが表示されるのですが、
問題が起きるケースでは、ウィジェットの新規生成で付けられた連番のIDの数値が増え続けます。

解消法としては2通り

  • ウィジェットの生成を一度のみにして、以後は表示の更新のみにする。
  • ウィジェット生成時に name 引数で適当な文字列を与えて、新しいリソースの生成を抑制する。

他の問題点

time.sleep(1) は、GUIのプラグラムでは利用すべきではありません。
代わりに GUIライブラリの提供するタイマー機能 (tkinterではafter関数)を利用してください。

投稿2022/02/06 10:39

teamikl

総合スコア8760

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問