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

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

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

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

Tkinter

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

Q&A

解決済

1回答

7869閲覧

動的に変化する数字を表示するtkinterで数字のブレを無くしたい

tomo1998

総合スコア34

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2018/09/28 13:58

動的に変化する数字を表示するtkinterで数字のブレを無くしたい

スタートボタンを押せばストップウォッチのようにカウントをするプログラムを作ったのですが、実行してしばらくすると、数字の横幅の長さの関係上、表示される数字がぶれてしまいます

該当のソースコード

python3

1import time 2import tkinter as tk 3import tkinter.font as font 4import threading 5 6class Test(tk.Frame): 7 def __init__(self, master=None): 8 super().__init__(master) 9 self.stop_fg=False 10 self.frame=0.00 11 self.time_start=None 12 self.time_now=None 13 self.GUI() 14 15 def GUI(self): 16 self.Text001=tk.Label(text=self.frame) 17 self.Text001.grid(column=0,row=0) 18 Text001=tk.Label(text="sec") 19 Text001.grid(column=1,row=0) 20 Button001=tk.Button(text="Start",command=self.on_start) 21 Button001.grid(column=0,row=1) 22 Button002=tk.Button(text="Stop",command=self.on_stop) 23 Button002.grid(column=1,row=1) 24 Button002=tk.Button(text="Reset",command=self.on_reset) 25 Button002.grid(column=2,row=1) 26 27 def run(self): 28 self.stop_fg=False 29 if self.time_start==None: 30 self.time_start=time.time() 31 32 while self.stop_fg!=True: 33 self.time_now=time.time() 34 self.frame=round((self.time_now-self.time_start),2) 35 #print(self.frame) 36 self.Text001["text"]=self.frame 37 38 def on_start(self): 39 threading.Thread(target=self.run).start() 40 41 def on_stop(self): 42 self.stop_fg=True 43 44 def on_reset(self): 45 self.on_stop() 46 self.time_start=None 47 self.time_now=None 48 self.frame=0.00 49 self.Text001["text"]=self.frame 50 51 52root=tk.Tk() 53app=Test(master=root) 54app.mainloop()

試したこと

フォントを使えば解決できるかも!と思って手あたり次第様々なフォントを試したのですが、結局数字がぶれてしまい・・・どうにかして数字がぶれないようにする方法はないでしょうか?
時間を表示するwidgetはどうしてもgridで配置したいので、gridを使ってブレを解消できる方法があればぜひ教えてくださいー!お願いします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

これでどうでしょうか。

Python

1import time 2import tkinter as tk 3import tkinter.font as font 4import threading 5 6class Test(tk.Frame): 7 def __init__(self, master=None): 8 super().__init__(master) 9 self.stop_fg=False 10 self.frame="0.00" 11 self.time_start=None 12 self.time_now=None 13 self.GUI() 14 15 def GUI(self): 16 self.Text001=tk.Label(text=self.frame, anchor='w') 17 self.Text001.grid(column=0,row=0) 18 Text001=tk.Label(text="sec") 19 Text001.grid(column=1,row=0) 20 Button001=tk.Button(text="Start",command=self.on_start) 21 Button001.grid(column=0,row=1) 22 Button002=tk.Button(text="Stop",command=self.on_stop) 23 Button002.grid(column=1,row=1) 24 Button002=tk.Button(text="Reset",command=self.on_reset) 25 Button002.grid(column=2,row=1) 26 27 def run(self): 28 self.stop_fg=False 29 if self.time_start==None: 30 self.time_start=time.time() 31 32 while self.stop_fg!=True: 33 self.time_now=time.time() 34 self.frame="{:.2f}".format(self.time_now-self.time_start) 35 #print(self.frame) 36 self.Text001["text"]=self.frame 37 38 def on_start(self): 39 threading.Thread(target=self.run).start() 40 41 def on_stop(self): 42 self.stop_fg=True 43 44 def on_reset(self): 45 self.on_stop() 46 self.time_start=None 47 self.time_now=None 48 self.frame="0.00" 49 self.Text001["text"]=self.frame 50 51 52root=tk.Tk() 53app=Test(master=root) 54app.mainloop()

修正点は大きく2つ
1.self.Text001=tk.Label(text=self.frame, anchor='w')anchor='w' を設定し、タイマーの表示を右詰めするようにする

2.self.frame に時間を格納する際、文字列として格納する。
この時、小数点以下2桁まで0埋めで出力する

となっております

投稿2018/09/28 14:51

magichan

総合スコア15898

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

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

tomo1998

2018/09/28 15:08

おぉっ・・!こ、これは! 申し分なくばっちりでありがたいです! でも、ちょっとわからないのですが何故2つ目の修正点で文字列型にしないとブレが解消しないのでしょうか? それと、magichanさんの解答見ていろいろ試したのですが、なぜ self.frame=str(round((self.time_now-self.time_start),2)) では文字ズレは解消できないんですか?教えていただけると嬉しいですm(_ _)m
magichan

2018/09/28 15:37

どもです。 簡単に言うと、数値(float)型の場合 1. も 1.0 も 1.00 も 1.00000000 も全て同じ値です ですので self.flame = 1. と書こうと self.flame = 1.00 と書こうと全く同じ処理となります。 試しに print(1.) print(1.00) print(1.00000) の結果を見るとわかりやすいかもしれません。 ですので、 self.flame = 1.00 と書いたからと言って、表示が少数点以下2桁まで表示する保証は全く無いのです。
magichan

2018/09/28 15:45 編集

しかし文字列は違います。 "1.0" と "1.00" は明らかに別ものとして処理されますし、 print("1.00") と書くと、間違いなく少数点以下2桁まで表示されます。 ということで、文字列にすることで、毎回確実に少数点以下2桁まで表示されるため、ブレることはなくなります。
tomo1998

2018/09/28 15:45

なるほど・・・つまり、桁が表示されなくなるゆえにブレが起こるってことですか?
tomo1998

2018/09/28 15:46

あ、ごめんなさい もう一つのコメントがまだ表示されていなくって返事を・・・汗 ほうほう、そうだったんですね!おかげさまでとってもよくわかりました!
magichan

2018/09/28 15:51

はい、その通りです。 元々のソースコードを動作させると、リセット後に self.flame = 0.00 としているにも関わらず、表示は "0.0" となっているかと思います。 つまり、小数点第2が 0 の時に小数点第1までしか表示されていないのがブレる原因かと思います
tomo1998

2018/09/28 17:16

すいません!もう一つ質問があります! self.frame="{:.2f}".format(self.time_now-self.time_start) の事なのですが、この{:.2f}の.2は小数点2桁のことを示しているのは分かるのですが、fの意味がよくわからないんです。ネットで調べてみたのですがまだわからなくって・・・汗 もしよければコメントを・・!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問