一、多个GtkWindow
在GTK+中,并不推荐使用多个GtkWindow来创建多文档界面(MDI),而是推荐使用单个GtkWindow内嵌入的小部件(如GtkNotebook)来实现类似的效果。然而,如果确实想要创建多个窗口的例子,以下是一个简单的Python脚本,使用Gtk来创建多个窗口实例。每个窗口都可以独立打开和关闭,且具有自己的标题和大小。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtkclass MainWindow(Gtk.Window):def __init__(self, title):super(MainWindow, self).__init__(title=title)# 设置窗口属性self.set_default_size(400, 200)# 创建按钮self.button = Gtk.Button(label="Open new window")self.button.connect("clicked", self.on_button_clicked)# 将按钮添加到窗口self.add(self.button)def on_button_clicked(self, widget):# 打开一个新的窗口new_window = SecondaryWindow()new_window.show_all()class SecondaryWindow(Gtk.Window):def __init__(self):super(SecondaryWindow, self).__init__(title="Secondary Window")self.set_default_size(300, 150)label = Gtk.Label("This is another window")self.add(label)# 创建应用程序
def main():# 初始化GTKGtk.init()# 创建主窗口实例并显示main_window = MainWindow(title="Main Window")main_window.connect("destroy", Gtk.main_quit) # 点击关闭时退出GTK循环main_window.show_all()# 进入GTK循环Gtk.main()if __name__ == "__main__":main()
在这个例子里,我们创建了 MainWindow 类的一个实例,它本身是一个 Gtk.Window 类的子类。在这个 MainWindow 中,我们放置了一个按钮,点击按钮时会创建一个新的 SecondaryWindow 实例(一个新的窗口)并显示。`SecondaryWindow` 类也是 Gtk.Window 类的子类,它显示了一个简单的标签。
这违反了GTK+和一般的桌面应用程序的设计准则,通常主张使用单个主窗口,并在该窗口中切换视图或打开对话框等,而不是创建多个顶级窗口。如果你需要实现类似MDI的功能,建议使用`GtkNotebook`或其他容器小部件。
二、MainWindow 中使用GtkNotebook、GtkPaned、GtkFrame
在GTK+中使用`GtkWindow`来创建新窗口,使用`GtkNotebook`来制作选项卡式界面,`GtkPaned`允许用户调整两个widget的大小,而`GtkFrame`为其中的内容提供了装饰性边框。
下面是一个简单的例子,它创建了一个主窗口(`MainWindow`),其中包含一个`GtkNotebook`、`GtkPaned`和`GtkFrame`的组合。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtkclass MainWindow(Gtk.Window):def __init__(self):super(MainWindow, self).__init__(title="Multiple GtkWindow Example")self.set_default_size(800, 600)self.connect("destroy", Gtk.main_quit)# 创建Notebooknotebook = Gtk.Notebook()self.add(notebook)# 创建Paned窗口paned = Gtk.Paned()notebook.append_page(paned, Gtk.Label('Tab 1'))# 在Paned窗口的一侧添加Frameframe1 = Gtk.Frame()frame1.set_size_request(200, -1) # 宽200,高度不设限frame1.add(Gtk.Label("Left Pane Content"))paned.add1(frame1)# 在另一侧添加Frameframe2 = Gtk.Frame()frame2.add(Gtk.Label("Right Pane Content"))paned.add2(frame2)# 另一个选项卡notebook.append_page(Gtk.Label('Tab 2 Content'), Gtk.Label('Tab 2'))def run(self):self.show_all()Gtk.main()if __name__ == "__main__":main_win = MainWindow()main_win.run()
运行此程序会创建一个主窗口,包含一个带有两个标签的`GtkNotebook`。第一个标签页有一个`GtkPaned`,是水平分割的,并且分割窗口中的每一侧都有一个`GtkFrame`,里面包含一个标签。第二个标签页只是简单地显示另一段文本。
确保已经在系统中安装了所有必需的GTK+依赖项,然后才尝试运行此脚本。
很重要的一点是,在实现复杂的GTK+界面时,应考虑划分代码到各自的类或模块中,这样有利于代码的维护和扩展,以上代码是一个简单的示例,用于说明如何使用GTK+创建基本的组件和布局。
三、多个子窗口(GtkWindow)使用GtkNotebook、GtkPaned、GtkStack
要在Python中创建一个使用了多个子窗口(GtkWindow)并在这些子窗口中使用GtkNotebook、GtkPaned、GtkStack的GTK+程序,可以基于以下概念性的代码。以下是一个简单的示例,它会创建一个主窗口和一个带有多个组件的子窗口。该例子使用 PyGObject,它是 GTK+ 3 的 Python 绑定。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtkclass MainWindow(Gtk.Window):def __init__(self):Gtk.Window.__init__(self, title="Main Window")self.set_default_size(400, 300)# 创建按钮打开新窗口button = Gtk.Button(label="Open Child Window")button.connect("clicked", self.open_child_window)self.add(button)def open_child_window(self, widget):child_window = ChildWindow()child_window.show_all()class ChildWindow(Gtk.Window):def __init__(self):Gtk.Window.__init__(self, title="Child Window")self.set_default_size(600, 400)notebook = Gtk.Notebook()self.add(notebook)# 第一页,使用 GtkPanedpaned_page = Gtk.Paned()paned_label1 = Gtk.Label(label="Pane 1")paned_label2 = Gtk.Label(label="Pane 2")paned_page.add1(paned_label1)paned_page.add2(paned_label2)notebook.append_page(paned_page, Gtk.Label(label="GtkPaned"))# 第二页,使用 GtkStackstack_page = Gtk.Stack()stack_switcher = Gtk.StackSwitcher()stack_switcher.set_stack(stack_page)stack_label1 = Gtk.Label(label="Stack Page 1")stack_page.add_titled(stack_label1, "label1", "Stack 1")stack_label2 = Gtk.Label(label="Stack Page 2")stack_page.add_titled(stack_label2, "label2", "Stack 2")stack_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)stack_box.pack_start(stack_switcher, False, True, 0)stack_box.pack_start(stack_page, True, True, 0)notebook.append_page(stack_box, Gtk.Label(label="GtkStack"))# 显示所有部件self.show_all()win = MainWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
在这个示例中,我们创建了一个 MainWindow 类,它有一个按钮用于打开子窗口。点击按钮会创建一个 ChildWindow 实例。`ChildWindow` 类初始化函数会创建一个 GtkNotebook 小部件,并添加两个选项卡:
- 第一个选项卡是一个 GtkPaned 小部件,分为两部分,每部分都是一个简单的 GtkLabel。
- 第二个选项卡使用了 GtkStack 和 GtkStackSwitcher 来在两个标签之间切换,每个标签页面仅有一个 GtkLabel。
请注意,如果想在子窗口中进一步操作或处理数据,可能需要在 MainWindow 类和 ChildWindow 类中添加更多的逻辑。
要在Windows系统上运行此程序,需要确保 GTK+3 已被正确安装,如前面的解答中所述。这里的示例可能会需要根据具体需求和设计进行调整,但该代码提供了在子窗口中使用多个不同组件的基本模式。