2014-01-13 61 views
0

我使用Tkinter創建了一個小時間管理工具,這樣我就可以繼續工作。我遇到了一個我看起來無法工作的問題。我正在使用錯誤框,以便它顯示在所有其他窗口的前面。我怎樣才能同時產生多個tkMessageBox.showerror?

現在,程序在一個函數上啓動一個新線程,該函數會跟蹤時間,並將其與用戶輸入任務的時間進行比較。一旦實時>用戶輸入的時間,它會啓動另一個線程來產生tkMessageBox。我已經嘗試過這種方法,但不啓動一個新的線程來產生tkMessageBox,問題是一樣的。如果用戶輸入2個單獨任務的同一時間,則彈出的錯誤會凍結。我在查找有關此主題的信息時遇到了困難...這種行爲很奇怪,因爲如果我有2個提醒,讓我們說1在0600和一個在0601,但我不關閉彈出的第一個錯誤框並讓它直到第二次警報觸發爲止,第二次警報將會取代第一次警報(如果可能,我想要彈出多個錯誤框)。只有具有相同觸發時間的警報纔會導致彈出窗口凍結。

這是我的第一個GUI程序,在過去24小時內纔開始學習線程和GUI的概念,所以我不確定這是線程還是tkMessageBox的問題。由於錯誤框的行爲,我認爲它是與tkMessageBox模塊組合的線程模塊。我使用的命令是:

tkMessageBox.showerror('TIMER ALERT!!!', comp_msg) 

Here is the source我擺在那裏的意見,以幫助。我說的tkMessageBox是56行。

我想我不確定我是否可以做我想用彈出框做的事情,如果可以的話,我不知道如何。如果我不能,是否有另一種方法用Tkinter產生多個錯誤類型的彈出框?我只想讓多個盒子能夠在任何給定時間出現。

在此先感謝,我非常感謝所有幫助。

編輯:

import thread 
from Tkinter import * 

#Spawns Error Box. Runs in it's own thread. 
def message_box(comp_msg,q):  # q is an empty string because of thread module. 
    print "Spawning Error Box..." 
    eb =Toplevel() 
    eb.config(master=None,bg="red") 
    pop_l = Label(eb,text="ALERT!!!") 
    pop_l2=Label(eb,text=comp_msg) 
    pop_l.pack(pady=10,padx=10) 
    pop_l2.pack(pady=15,padx=10) 
    return eb 

thread.start_new_thread(message_box,(comp_msg,"")) 

回答

1

tkmessageBox默認對話框是modal。您可以爲此應用程序實現一個簡單的無模式對話框。 Here是關於創建自定義對話框的一個很好的文檔。

通過這種方式,您可以創建儘可能多的新自定義對話框作爲您的應用程序所需,因爲每個只是一個新的Toplevel。

這是一個簡單的Tkinter應用程序,顯示主窗口上的時鐘。當你點擊按鈕時,它會在新線程中啓動新的tkMessageBox對話框。 (如果運行它)您可以看到運行TK事件循環的主線程正在工作(因爲時間正在更新),但錯誤框未按預期顯示。

#!/usr/bin/env python 

import datetime 
import threading                                                                
from Tkinter import * 
import tkMessageBox 

class MyApp(Frame): 
    def __init__(self, root=None): 
     if not root: 
      root = Tk() 
     self.time_var = StringVar() 
     self.time_var.set('starting timer ...') 

     self.root = root 
     Frame.__init__(self, root) 
     self.init_widgets() 
     self.update_time() 

    def init_widgets(self): 
     self.label = Label(self.root, textvariable=self.time_var) 
     self.label.pack() 
     self.btn = Button(self.root, text='show error', command=self.spawn_errors) 
     self.btn.pack() 

    def update_time(self): 
     self.time_var.set(str(datetime.datetime.now())) 
     self.root.after(1000, self.update_time) 

    def spawn_errors(self): 
     for i in range(3): 
      t = threading.Thread(target=self.show_error) 
      t.start() 

    def show_error(self): 
     now = datetime.datetime.now() 
     tkMessageBox.showerror('Error: %s' % (str(now)), now) 


if __name__ == '__main__': 
    app = MyApp() 
    app.mainloop() 
+0

謝謝你farzad!在編程方面,我更像是一個業餘愛好者,所以當涉及到Tkinter的課程時,它就會超出我的想象。無論如何,我正在看它,看看我能否弄清楚。因爲我以前從來沒有用過它們,所以我只是很難上課。再次感謝你! – DuckPuncher

+0

不客氣。我添加了一個示例代碼,以便您可以將它用作應用程序的基礎。 – farzad

+0

不要怕類。通過真正開始編碼,你已經完成了最艱難的任務。你可以很容易地瞭解所有這些,Python是一種清晰的學習/編程的愉快語言。每當你有問題時,你都知道在哪裏問。;) – farzad

相關問題