2011-02-04 47 views
1

我與原型GUI PyGTK的佈局,有時使用格萊德/建設者有時沒有,和下面的場景重複不休:與事件創建一個PyGTK的GUI本身重裝

  1. 修改代碼
  2. 運行GUI腳本
  3. 法官的結果
  4. 修改再重新
  5. 運行...

所以,因爲我聽說Python允許重新加載模塊,所以我想知道是否可以在沒有關閉窗口的情況下修改代碼,然後從窗口本身說,單擊按鈕「重新加載」窗口反映了代碼的變化。

由於這是一個概念性問題,我沒有任何特定的代碼來顯示。

感謝您的關注

回答

0

我認爲這是可能的,如果你做到以下幾點:

  1. 鑑別和分離,你希望看到更新的,當你按下按鈕(如果你想要的部件w查看整個窗口更新,然後將其添加到窗口中,而不是窗口本身)。
  2. 寫一個函數(或類)創建並返回此微
  3. 將一個模塊中此功能或類,你會重新
  4. W外側創建按鈕,並將其連接到執行以下 功能
    • 從窗口
    • 重新加載模塊刪除當前W¯¯
    • 創建W的
    • 將它添加到窗口新實例

當然,這裏的關鍵步驟是「重新加載模塊」。我想你必須確保模塊中沒有代碼正在運行,並且沒有其他模塊依賴於此模塊中定義的變量。

編輯:我有一些時間,所以我做了一個小原型。更改widget_module.py標籤,然後點擊更新

gui.py

# Load in pygtk and gtk 

import pygtk 
pygtk.require('2.0') 
import gtk 
import widget_module 

# Define the main window 

class Whc: 
    def __init__(self): 
     # Window and framework 
     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.window.connect("destroy", self.destroy) 

     # A Button, with an action 
     # Add it to the geometry 
     # show the button 
     self.button = gtk.Button("Update") 
     self.button.connect("clicked", self.update, None) 

     self.vbox = gtk.VBox() 
     self.vbox.pack_start(self.button) 
     self.widget = widget_module.get_widget() 
     self.vbox.pack_start(self.widget) 

     self.window.add(self.vbox) 


     # Show the window 
     self.window.show_all() 

    # Callback function for use when the button is pressed 

    def update(self, widget, data=None): 
     print "Update" 
     self.vbox.remove(self.widget) 
     reload(widget_module) 
     self.widget = widget_module.get_widget() 
     self.vbox.pack_start(self.widget) 
     self.widget.show() 


    # Destroy method causes appliaction to exit 
    # when main window closed 

    def destroy(self, widget, data=None): 
     gtk.main_quit() 

    # All PyGTK applicatons need a main method - event loop 

    def main(self): 
     gtk.main() 

if __name__ == "__main__": 
    base = Whc() 
    base.main() 

widget_module.py

import pygtk 
import gtk 

def get_widget(): 
    return gtk.Label("hello") 
+0

大,容,你的答案是非常有益的。我一直在考慮銷燬整個窗口,但由於小部件樹總是嵌套在某個「最上層」小部件內部,所以淨效應應該是相同的,甚至更好。再次感謝! – heltonbiker 2011-02-07 18:17:03