Tkinterメインループを起動する必要があります。ちょうどあなたの
showTime()
呼び出しの後、スクリプトの最後に
root.mainloop()
を追加します。
あなたのスクリプトがIDLEで動作するのは、IDLE自体がTkinterプログラムであり、既にイベントループがthis answerに記載されているからです。
ところで、showTime
でそのif True:
文は無意味です。
FWIW、ここではmainloop呼び出しが追加されたプログラムとその他のマイナーな変更がいくつかあります。は130を超える名前を持ちます。たとえば、インポートされた名前で名前空間が混乱するため、「スター」のインポートを避ける方がよいでしょう。これは、Tkinterが定義するすべての名前に精通していない限り、自分自身で定義した名前と衝突する可能性がありますが、Tkinterが使用する名前を使用する別のモジュールでスターインポートを使用すると特に問題になります。
import time
import tkinter as tk
def showTime():
canvas.delete('text')
actualTime = time.localtime()
text = canvas.create_text((100, 50),
text = actualTime[3:6],
fill="white",
font=("Verdana", 20, "bold"),
tag="text")
root.after(1000, showTime)
if "__main__" == __name__:
root = tk.Tk()
root.resizable(False,False)
root.title("Clock")
canvas = tk.Canvas(root, width=200, height=100, bg="black", cursor="target")
canvas.create_rectangle((20, 20), (180, 80), outline="ghostwhite")
canvas.pack()
showTime()
root.mainloop()
ブライアンオークリーはコメントで述べているように、それだけではなく、古いテキストアイテムを中傷し、新鮮なものを毎秒を構築するよりもキャンバステキストアイテムのテキスト文字列を、更新する方が良いでしょう。だからあなたのコードから派生した新しいバージョンがあります。それは単にtime.localtime
によって返さstruct_time
オブジェクトをスライスするよりもよりよい出力を与えるので
私は、時間文字列を構築するためにtime.strftime
を使用します。それは常に2時間の桁、分、秒のコンポーネントを使用して、あなたは簡単にコロンを追加することができます(または何でも)をフォーマット文字列に変換します。 strftime
が提供するすべてのフォーマットオプションについてはリンク先のドキュメントをご覧ください。
私はGUIをクラスに入れました。このようなシンプルなGUIではこれは本当に必要なことではありませんが、コードをモジュール化するために入るのは良い習慣です。
import tkinter as tk
from time import strftime
class Clock:
def __init__(self):
root = tk.Tk()
root.title("Clock")
root.resizable(False, False)
self.canvas = canvas = tk.Canvas(root, width=200, height=100,
bg="black", cursor="target")
canvas.create_rectangle((20, 20), (180, 80), outline="ghostwhite")
canvas.create_text((100, 50), tag = "text",
fill="white", font=("Verdana", 20, "bold"))
canvas.pack()
self.show_time()
root.mainloop()
def show_time(self):
w = self.canvas
w.itemconfig("text", text=strftime('%H %M %S'))
w.after(1000, self.show_time)
if "__main__" == __name__:
Clock()
もっと具体的に言えば、IDLEとデスクトップからどのように実行しますか? – jonrsharpe