2016-11-29 7 views
0

他の場所をクリックするとtkinter guiがフリーズし始めます。それを防ぐ方法はありますか?表示用ラベルはボタンそのものですので、私は「ラベル」という名前を付けます:他の場所をクリックするとtkinterがフリーズするのを防ぐ方法は?

#========================= 
from tkinter import * 
from time import sleep 
import random 

#===================== 
root=Tk() 
root.title("Wise Words") 
root.geometry("500x180+360+30") 
root.resizable(0,0) 
root.call("wm", "attributes", ".", "-topmost", "1") 

#=================== 
def display(random): 
    if random == 1: 
     return "Be wise today so you don't cry tomorrow" 
    elif random == 2: 
     return "Frustration is the result of failed expectations" 
    elif random == 3: 
     return "Wishes are possibilities. Dare to make a wish" 
    if True: 
     sleep(4) 
     r=random.randint(1,3) 
     sentence=display(r) 
     label.configure(text=str(sentence)) 
     label.update_idletasks() 

    root.after(5000, display(random)) 

#================== 
def Click(event): 
    display(random) 

#====================== 
label=Button(root, fg="white", bg="blue", text="Click to start!", 
    font=("Tahoma", 20, "bold"), width=40, height=4, 
    wraplength=400) 
label.bind("<Button-1>", Click) 
label.pack() 

#================ 
root.mainloop() 

注:

は、ここに私のコードです。あなたのコード内でいくつかの奇妙なことをやっている

+0

なぜ 'time.sleep'と' root.after'を使用していますか?また、それを参照する以外の 'random'モジュールで何もすることは決してありませんし、それが整数に等しいと期待しています(決してありません)。 – TigerhawkT3

+0

私はtimeモジュールを削除しても、root.afterが5000に設定されていても遅滞なくループを開始しました。これは私が望むものではありません。ランダムモジュールを使用してディスプレイをランダム化します。 r = random.randint(1,3)、次にsentence = display(r)を参照してください。 –

+0

ああ、私はあなたがどこで 'ランダム 'で何かをするのを見る。しかし、あなたはすぐにそれを再帰呼び出しで使用しています。そして、あなたは 'after'を通してその関数を_again_呼び出します。したがって、問題のある「スリープ」の後に再帰的に送信する有効な数値が1つあり、適切な 'after'を使って送信する無駄な値があります。それは良くありません。 – TigerhawkT3

答えて

3

:Tkinterのアプリケーション

  • ラベルボタンを呼び出すにtime.sleepを使用して

    • は、マウスの左バインディング
    • Label Tkinterのウィジェットがあります)ボタンをボタンに付けるのではなく、ボタンにボタンを付けるだけです。command
    • randomモジュールを渡して整数に評価すると期待しています
    • モジュール 渡された引数の両方を参照するために名前 randomを期待パラメータ名
    • でモジュール名をマスキング無条件分岐ステートメントを使用して、ボタン
    • から
    • 返す文字列(if True:
    • 既に呼び出されている関数で再帰呼び出しを行うafter
    • すでに呼び出しを自分自身にスケジュールしている関数にバインドされたままにしておくと、あなたの代わりに関数自体
    のランダムな文字列を選択するif構造を使用しての代わりに、関数呼び出し(display(random))の結果とafterコールのスケジュールrandom.choice
  • 使用して多くのコール
  • をスケジュールすることができ、

    これは必ずしも完全なリストではありません。

    上記の問題を修正しました。

    from tkinter import * 
    import random 
    
    def display(): 
        strings = ("Be wise today so you don't cry tomorrow", 
           "Frustration is the result of failed expectations", 
           "Wishes are possibilities. Dare to make a wish") 
        button.config(text=random.choice(strings)) 
    
        root.after(5000, display) 
    
    def click(event=None): 
        button.config(command='') 
        display() 
    
    root=Tk() 
    root.title("Wise Words") 
    root.geometry("500x180+360+30") 
    root.resizable(0,0) 
    root.call("wm", "attributes", ".", "-topmost", "1") 
    button = Button(root, fg="white", bg="blue", text="Click to start!", 
        font=("Tahoma", 20, "bold"), width=40, height=4, 
        wraplength=400, command=click) 
    button.pack() 
    
    root.mainloop() 
    
  • 関連する問題