8

特定のイベントで通知するスクリプトを Python で作成しました。次の関数を使用して警告ウィンドウを生成しています。

def window_warn():
    '''
    This function will throw up a window with some text
    '''
    #These two lines get rid of tk root window
    root = Tkinter.Tk()
    root.withdraw()
    #tkMessageBox.deiconify() 
    TkMessageBox.showwarning("New Case", "You have a new case\n Please restart pycheck")
    return

ウィンドウは正常に描画されますが、[OK] をクリックすると、ボタンが押されたままウィンドウが表示されたままになります。xfceを使用しています。[OK] をクリックした後にウィンドウを閉じる方法はありますか?

コメントは、これが周囲のコードに関係している可能性があることを示しているため、完全を期すために:

print "Just started newcase check"
while True:
    if "Uncommitted" in webpage:
        print "oh look, 'Uncommitted' is in the url returned from the last function"
        #If this hits we call a notification window
        window_warn()
        print "sleeping"
        time.sleep(10)

        webpage = scrape_page()
    else:
        print "nothing"
        time.sleep(20)
        webpage = scrape_page()
4

5 に答える 5

9

root.update()関数から戻る前に呼び出してみてください。これにより、保留中の Tk/X ウィンドウ イベントがすべて処理されます。

(理想的には、ウィンドウを表示する前にメイン イベント ループを確立しますが、これはプログラム全体がイベント ドリブンであることを前提としているため、常に機能するとは限りません。)

于 2013-07-21T22:05:03.480 に答える
0

root.mainloop()プログラムがイベントに応答できるようにするには、呼び出す必要があります。

于 2013-07-17T11:15:28.833 に答える
0

もう 1 つの解決策は、tk.messageboxが発生したかどうかを追跡し、ブレーク/続行/パスだけで発生した をスキップするかどうかを追跡することtk.messageboxです。

Flag = False
if Flag: 
    messagebox.showerror("Error", "Your massage here.")
    Flag = True
else:
    break

専用のものはなく、クラス内にroot.mainloop()しかないため、StackOverflowで提案された他のソリューションに問題があったため、これを提案しますself.mainloop()Root()

私のルートは次のようになり、マッサージ イベントはいくつかの内部クラス内で生成されます。ここでは、self.root にアクセスできません。

    class Root(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            ....
            class 1..
            class 2..
            self.mainloop()
于 2018-03-30T12:09:06.407 に答える