🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

1回答

2111閲覧

Python Tkinterでの処理を軽くしたい

kakini

総合スコア42

Python 3.x

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

0グッド

0クリップ

投稿2019/11/23 11:35

OSはwindows7 pythonは3.6.1を使っています
CPU2.6G メモリ3.89G

現在Tkinterを使ってストップウォッチみたいな画面を作ろうとしています
前回質問させて頂いた時にほぼ全て完成したんですが
この後、色々オプションを付けてみようという事になり
ラベルやボタン、メニューバーを付けようと思いそれをやろうとしたら

コードを実行した時、画面は出てくるんですが
その画面にマウスのカーソルを合わせると「処理中」を意味するような青い円が回転してる
エフェクトが出てきて(Tkinterの画面のみ画面外にカーソルを出すと処理中の表示は消える)
非常に重いです
一応画面のストップウォッチの数字はちゃんと1秒刻みで進んでるみたいですが
ボタンやメニューバーを押せる様な状況ではないです
この重い処理を軽くするにはどうしたらいいでしょうか?

メインがこちら

python

1from tkinter import * 2from time import sleep 3import timer1 4 5 6def write_time(): 7 8 cv.delete("all") 9 10 cv.create_rectangle(0,0,500,500,fill="green") 11 12 cv.place(x=200,y=0) 13 14 TD=timer1.timerope() 15 16 cv.create_text(150,30,fill="black",text=TD) 17 18 sleep(1) 19 20 win.after(1,write_time) 21 22 23 24#画面作成 25win=Tk() 26win.title("タイマー") 27win.geometry("500x500") 28 29 30#ラベル作成 31static1=Label(text="8月1日") 32static1.place(x=50,y=30) 33 34 35#ボタン作成 36btn=Button(win,text="開始",width=15) 37btn.pack(padx=20,side="left") 38 39btn=Button(win,text="終了",width=15) 40btn.pack(padx=20,side="left") 41 42 43#描画 44cv=Canvas(win,width=300,height=500) 45cv.pack() 46win.after(1,write_time()) 47win.mainloop() 48

メインで使ってるtimer1モジュールがこちら

python

1import datetime 2import math 3 4def timerope(): 5 dt1=datetime.datetime(year=2019,month=8,day=1,hour=0) 6 7 dt2=datetime.datetime.now() 8 9 td=dt2-dt1 10 11 TD=math.floor(td.total_seconds()) 12 13 return TD 14 15コード

元々メインの中にボタンやメニューバーのコードを書いてましたが
あまりにも重くて書く意味が無かったので↑では外してます
そもそも上の時点で既に重いです

それとボタンの配置なんですがpack()関数だと配置を上下左右の4箇所にしか設定できず
キャンバスの部分に重なって片方が見えなくなるので
ボタンは2つとも左詰めにして上から「開始・終了」の順に並べたいのですが
位置を細かく指定するにはどうやったらいいんでしょうか

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

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

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

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

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

guest

回答1

0

ベストアンサー

この重い処理を軽くするにはどうしたらいいでしょうか?

タイマー処理の中でsleep(1)を行っているのが原因です。
この処理を消してタイマーの呼び出し周期を1秒にするのがよいと思います。
今回の場合ですとwin.after(1,write_time)win.after(1000,write_time)にします。

Tkinerに限らずGUI制御は関数を実行していない状態(メインスレッドがイベントループを処理し続けている状態)でないとボタン押下などのイベント処理や画面の再描画が行われなくなります。

投稿2019/11/24 00:28

nomuken

総合スコア1627

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

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

kakini

2019/11/30 07:20

返答が遅くなり申し訳ありません。 先ほど試させていただきました所、ボタンやメニューバー等全てきちんと押せるようになっておりました ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問