2012-12-21 105 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。