2012-07-10 107 views
3

我需要一個簡單的信息框來顯示一些狀態輸出,我可以使用print轉儲到控制檯。我發現最簡單的可能性是:Tkinter中的非阻塞信息對話框

import Tkinter as tk 
root = tk.Tk() 
root.withdraw() 

from tkMessageBox import showinfo  
showinfo('some caption', 'some info') 

這個實現的唯一的問題是我的程序(不是寫在Tkinter的)將不會繼續運行,直到showinfo消息框的「確定」按鈕被按下。也就是說,showinfo對話框將被阻止。

因此我的問題:有沒有簡單的方法使showinfo非阻塞? Tkinter中是否有其他的消息框實現是非阻塞的?我可以想到顯示幫助頁面的典型用法 - 窗口應該打開並且主程序保持正常運行。

EDIT1:這裏就是我想出了一個簡單的幫助窗口,但遺憾的是它並沒有顯示出來,除非我推出一個不同tkMessageBox或類似物體:

class TextInfo(object): 

    def __init__(self, parent, window_title = 'window', textfield = 'a text field', label = None): 

     self.top = tk.Toplevel(parent) 
     self.parent = parent 
     self.window_title = window_title 
     self.textfield = textfield 

     # set window title 
     if window_title: 
      self.top.title(window_title) 

     # add label if given 
     if label: 
      tk.Label(self.top, text=window_title).grid(row=0) 

     # create the text field 
     self.textField = tk.Text(self.top, width=80, height=20, wrap=tk.NONE) 
     if textfield: 
      self.textField.insert(1.0, textfield) 
     self.textField.grid(row=1) 

     # create the ok button 
     b = tk.Button(self.top, text="OK", command=self.ok) 
     b.grid(row=2) 

    def ok(self): 
     self.top.destroy() 

這是怎麼我打電話給窗口:

root = tk.Tk() 
root.withdraw() 
TextInfo(self.root, window_title, textfield, label) 
# don't call root.mainloop() here, because this will lead to blocking. 

是否有某種屬性或事件需要設置窗口顯示?如果我撥打root.mainloop(),窗口會顯示出來,但是我的GUI再次被阻止。

+0

Dialog(和派生的DialogBox)在它的Show方法中做一個不可配置的全局抓取,所以不行,除了子類和使用替代Show方法外,不能使Dialog非阻塞。 請參閱http://perlmonks.org/?node_id=836513 for perl實現 – 2012-07-10 17:35:10

+0

@JoranBeasley所以Tkinter中沒有「幫助頁面」類型的對話框,只會彈出並坐在那裏? – memyself 2012-07-10 18:13:15

回答

2

不要使用tkMessageBox,因爲它不允許太多配置。只需創建您自己的自定義對話框,看起來像一個。這個page談了很多關於創建自定義Tkinter對話框。

+0

謝謝!我把一些代碼放在一起,不幸的是它只在我在控制檯上運行它時才起作用 - 而不是通過我的GUI。不知何故,如果我啓動一個'正確的'tkinter窗口,我的Tkinter對話框就會顯示出來。任何線索我的實現有什麼問題? – memyself 2012-07-10 19:27:03

+0

您可能需要在後臺運行正確的GUI。我想你可以在顯示對話框時隱藏主GUI,然後再次顯示。此鏈接顯示了一種方法:http://www.daniweb.com/software-development/python/threads/243559/need-help-tkinter-hide-window-then-show – 2012-07-10 19:59:11

+0

我不使用Tkinter作爲我的主要GUI。您的解決方案不起作用:( – memyself 2012-07-10 22:22:53