2016-12-10 15 views
1

私はこのスクリプトをしばらく持っていました。しかし、IDLEから起動すると実行されます。デスクトップから実行しようとすると起動しません。 Tkinterで作られた時計です。PythonスクリプトはIDLEでしか動作しません

import time 

from tkinter import * 

def showTime(): 

    canvas.delete('text') 
    if True: 
     actualTime = time.localtime() 

     text = canvas.create_text((100,50,), 
            text =(actualTime[3],actualTime[4],actualTime[5]), 
            fill="white", 
            font=("Verdana",20,"bold"), 
            tag="text") 

    root.after(1000,showTime) 

if "__main__" == __name__: 

    root = Tk() 

    root.resizable(False,False) 
    root.title("Clock") 

    canvas = Canvas(root, width=200, height=100,bg="black",cursor="target") 
    canvas.create_rectangle((20,20),(180,80),outline="ghostwhite") 
    canvas.pack() 

    showTime() 
+1

もっと具体的に言えば、IDLEとデスクトップからどのように実行しますか? – jonrsharpe

答えて

4

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() 
+1

さらに多くのキャンバスアイテムを作成し続ける理由はありません。 1つのアイテムを作成し、表示されるテキストを変更する方が効率的です。 –

+0

@BryanOakley非常に良い点。私はOPのコードにいくつかの明らかなマイナーな改良を加えたかっただけですが、私は新しいバージョンを追加しました。 –

関連する問題