2012-12-21 142 views
0

我有一個很大的問題(對我來說)與python gtk模塊。Python的gtk多窗口

我可以打開多窗口;但我不能單獨關閉(一次,一個窗口)。 如果我關閉一個窗口,所有的窗口會自動關閉。 我只想關閉第一個窗口。在關閉窗口後,來一個新窗口(由我選擇)。

例如:

#!/usr/bin/env python 

import pygtk 
pygtk.require20() 
import gtk 

class CLS1(object): 
    def __init__(self): 
     self.mywindow = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.mywindow.connect("delete_event", gtk.main_quit) 

     self.btn = gtk.Button("Cls1|Btn") 

     self.mywindow.add(self.btn) 

     self.mywindow.show_all() 

    def main(self): 
     gtk.main() 

class CLS2(object): 
    def __init__(self): 
     self.mywindow = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.mywindow.connect("delete_event", gtk.main_quit) 

     self.btn = gtk.Button("Cls2|Btn") 

     self.mywindow.add(self.btn) 

     self.mywindow.show_all() 

    def main(self): 
     gtk.main() 


class APP(object): 
    def __init__(self): 
     self.mywindow = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.mywindow.connect("delete_event", gtk.main_quit) 

     self.hori = gtk.HBox() 

     self.btn1 = gtk.Button("AppBtn1") 
     self.btn2 = gtk.Button("AppBtn2") 

     self.btn1.connect("clicked", self.show_me , "AppBtn1") 

     self.btn2.connect("clicked", self.show_me , "AppBtn2") 

     self.hori.pack_start(self.btn1) 
     self.hori.pack_start(self.btn2) 

     self.mywindow.add(self.hori) 

     self.mywindow.show_all() 


    def show_me(self, penar, data): 
     if data=="AppBtn1" : 
      CLS1().main() 

     if data=="AppBtn2": 
      CLS2().main() 

     gtk.main_quit() 

    def main(self): 
     gtk.main() 

APP().main() 

我想這一點:

1 - 我會運行程序

2- 「APP」 類將工作,並會 「APP」 窗口

3-如果我點擊一個按鈕(AppBt1或AppBtn2); 「APP」窗口將自動關閉(自動;不是由我!)

4-如果我在「APP」窗口(@step 3)上點擊了「AppBtn1」按鈕;或者如果我在「APP」窗口(@step 3)上單擊了「AppBtn2」按鈕,則「CLS1」類將會工作,並且其窗口將打開

; 「CLS2」類將工作,其窗口將打開

我想在程序運行時只在屏幕上的一個窗口;如果我點擊一個按鈕;它的窗口將關閉,並打開一個新窗口(由我選擇,並自動!)

我該怎麼做?並且你能寫下它的代碼:) 非常感謝!

回答

1

那麼更好的方法可能是修改已經打開的窗口,而不是關閉並打開另一個窗口。

2

調用gtk.main_quit會殺死整個程序(它基本上停止GTK)。所以你需要什麼,只是當最後一個窗口關閉時停止GTK 。你目前正在做的是在任何窗口關閉時停止GTK。

所以,只需使用一個全局變量,您將用作打開窗口的計數器。在刪除事件處理程序中,遞減該計數器,並且如果它達到0,這意味着您沒有更多的窗口打開,並且可以調用gtk.main_quit,否則不做任何操作,並且窗口通常會被銷燬。

當您連接到clicked信號時,要殺死父窗口,只需將父窗口作爲最後一個參數。在關聯的回調中,您將獲得最後一個參數並調用gtk.Widget.destroy。