2016-07-23 4 views
2

私が遭遇した問題は、画面に配置されたすべてのウィジェットを削除する前に、time.sleep(3)を使って3秒間最初の関数(StartUpScr)ウィジェットを3秒間保持しようとしている間に発生する問題です。次の関数(MenuScr)ウィジェットの配置を続けます。私は正常にdestroy()を使用して最初のウィジェットを削除し、2番目のウィジェットで置き換えることができましたが、何らかの理由で、関数とメインプログラムのどこにでもtime.sleep(3)を入力すると、 3秒間置き換えられた後、ブランク画面を生成するプログラムの開始が遅れてから、最初の画面をすばやく点滅してから2番目の画面に飛びます。Time.sleep()関数の配置

from tkinter import * 
import tkinter 
import time 



window = tkinter.Tk()        
window.title("BINARY-SUMS!!!")      
window.geometry("1000x800")       
window.wm_iconbitmap('flower3.ico')     
window.configure(background='lavender')    

def StartUpScr(): 
    StartUpScr = tkinter.Label(window, text="FIRST-SCREEN!!!",fg = "Aqua",bg = "Lavender",font = ("Adobe Gothic Std B", 90, "bold")).pack() 

StartUpLabel = tkinter.Label(window, text="Developed by Robert Bibb 2016",bg = "Lavender",font = ("Calibri Light (Headings)", 10, "italic")) 
    StartUpLabel.pack() 
    StartUpLabel.place(x = 400, y = 775) 


def MenuScr(): 
    StartUpScr = tkinter.Label(window, text="SECOND-SCREEN!!!",fg = "green",bg = "Lavender",font = ("Adobe Gothic Std B", 85, "bold")) 
    StartUpScr.pack() 


if __name__ == "__main__": 
    StartUpScr() 
    time.sleep(3) 
    for widget in window.winfo_children(): 
     widget.destroy() 
    MenuScr() 
+1

あなたは['window.after(time、callback)'](http://stackoverflow.com/questions/25753632/tkinter-how-to-use-after-method#25753719)を探しています –

+0

私は関数と変数に異なる名前を使用する。 –

+0

こんにちは、ロブ、下記の回答者にフィードバックをお願いしますか?彼らは皆、あなたを助けようと努力しているように見えます。 – halfer

答えて

2

time.sleep()は、プログラムの実行を停止して、あなたが後に使用する必要がありますここで働い...ともGUIプログラミングで睡眠を使用することは悪い習慣はありません。

root.after(time_delay, function_to_run, args_of_fun_to_run) 

だからあなたの場合にはそれが

def destroy(): 
    #destroy here 
    for widget in window.winfo_children(): 
     widget.destroy() 

とif文の後に気に入るだろう -

if __name__ == "__main__": 
    StartUpScr() 
    window.after(3000, destroy) 
    MenuScr() 
+0

これは間違いです - 'MenuScr()'はすぐに実行されます。元の画面を破棄して新しい画面を作成する関数を作成するか、 'after'を使用して3001ミリ秒で' MenuScr() 'を呼び出します。 –

1

だから我々は、次の3つの機能を定義している:firstScreensecondScreen、およびchangeScreenを。アイデアはfirstScreenを実行して3秒後に現在の親ウィンドウ(master)を破棄して、全く新しい世界を持っているsecondScreenを呼び出す次の新しい親ウィンドウ(master2)を作成して、changeScreenを実行しています。これが起こる方法です:

from tkinter import * 
root = Tk() 
import time 

class App: 
    def __init__(self, master): 
     self.master = master 
     self.master.geometry("500x500-500+50") 

    def firstScreen(self): 
     self.master.title("FIRST SCREEN") 
     self.label1 = Label(self.master, width=50, height=20, 
          text="This is my FIRST screen", bg='red') 
     self.label1.pack() 
     self.master.after(3000, self.changeScreen) 

    def secondScreen(self): 
     self.label2 = Label(self.master, width=50, height=20, 
          text="This is my SECOND screen", bg='yellow') 
     self.label2.pack() 

    def changeScreen(self): 
     self.master.destroy() 
     self.master2 = Tk() 
     self.master2.title('SECOND SCREEN') 
     myapp = App(self.master2) 
     myapp.secondScreen() 

myapp = App(root) 
myapp.firstScreen() 

私はそれが助けてくれることを望みます!

+0

なぜルートウィンドウを破壊して再作成するのですか?なぜ、1つのルートウィンドウを作成し、各スクリーンをフレームにするのはなぜですか?複数のルートウィンドウを作成して破壊することは無害ですが、tkinterはプログラムの存続期間中存続する単一のルートウィンドウを持つように設計されています。 –

+0

@BryanOakleyあなたが正しいです、あなたは私のコードを編集することを歓迎します。私は実際にフレームを使ってやりたかったのです。しかし、私はちょうど質問の本文に基づいてこの方法を選んだ: "私は正常に破壊()を使用して最初のウィジェットを削除し、それらを2番目のウィジェットに置き換えることができた"。だから私は問題がそこにあると思った。質問をしたユーザーからのフィードバックを見ることは素晴らしいことです。 –

関連する問題