2012-10-12 66 views
1

我正在Python/Glade中處理GUI應用程序,並且遇到以下問題。 我試圖得到一個關於對話框正常工作......然而,當我點擊「關閉」(在關於對話框),然後嘗試再次打開它,這是我所看到的:銷燬有關對話框沒有正確再現

enter image description here

所以,只是窗口的一小段片斷,還有一個不起作用的關閉按鈕。 這是我的課堂我格萊德窗口:

# glade object 
class MainWindow(object): 
    builder_ = None 

    # load main window 
    def __init__(self): 
    handler = { 
     "sigWindowDestroy" : gtk.main_quit, 
     "sigShowAbout"  : self.show_about 
    } 

    projfile = "proj.glade" 
    self.builder_ = gtk.Builder() 
    self.builder_.add_from_file(projfile) 
    self.builder_.connect_signals(handler) 
    window = self.builder_.get_object("main_window") 
    window.show() 

    # show about dialog 
    def show_about(self, *args): 
    dAbout = self.builder_.get_object("dAbout") 
    dAbout.run() 
    dAbout.destroy() 

在我的主要功能:

# load glade gui 
    app = MainWindow() 
    gtk.main() 

在第二次點擊,我看到在我的終端窗口下面的輸出(使用Mac OS X) 。

GtkWarning: gtk_widget_show: assertion `GTK_IS_WIDGET (widget)' failed 
    dAbout.run() 
GtkWarning: gtk_label_set_markup: assertion `GTK_IS_LABEL (label)' failed 
    dAbout.run() 

編輯:對不起,必須重新打開與PyGTK的一般不熟悉。

我建議使用show()/hide()方法而不是run()/destroy()。現在,我正在跟着另一個SO帖子,其中突出顯示this tutorial(誰說要使用run()/destroy()),並且看到了這種行爲。

首先,關閉按鈕什麼也不做。我曾經因爲某種原因認爲它的行爲是預先定義的。 其次,用角落關閉按鈕關閉對話框仍然提供與上述run()/destroy()一樣的行爲。


編輯2:通過添加以下解決:

dAbout.connect("response", lambda d, r: d.hide()) 
+1

不知道你的構建器是如何工作的,但是你確定你的'show_about'實例化了一個新的對話框,而不是從頭開始保存一個對話框嗎? – deinonychusaur

+0

@deinonychusaur:從它看起來像我有...我的猜測會是它擁有一個....我將如何去格式化這個來創建一個新的對話,而不是? – espais

+0

我不認爲我想走多個glade文件的路線(因爲鏈接似乎來回),但我同意我可能會破壞主要實例。你大概知道我可以怎麼做,也許,我的本地'show_about'方法中的原始實例的副本? – espais

回答

3

不要試圖(深孔)複製一個小部件。它不起作用,正如你發現的那樣。

取而代之的是hide()而不是destroy()

1

你甚至可以使用run()。你只是不應該使用destroy()。是什麼讓你思考,你不應該使用run()和hide()在一起?看到,當你銷燬一個小部件時,這意味着將它從內存中移除,就好像它從未被構建過一樣。如果您隱藏它,您可以稍後再使用它,但請注意用戶可能對其所做的更改,因爲該窗口將以隱藏之前的狀態重新顯示。您可以在隱藏的情況下從代碼操作小部件屬性。

關閉按鈕的「預定義」操作是由run()引起的。你使用lambda函數發佈的解決方案比run()爲你做的要多一點。基本上,它執行以下操作:

  • 連接您的DialogWindow
  • 連接您的DialogWindow的「刪除事件」信號
  • 顯示你的widget
  • 開始一個新的基於GTK主循環的「響應」信號阻止的應用
  • 斷開信號
  • 返回響應

你只需要隱藏()它後能夠再次運行()。