在GTK+中,并不推荐使用多个GtkWindow来创建多文档界面(MDI),而是推荐使用单个GtkWindow内嵌入的小部件(如GtkNotebook)来实现类似的效果。然而,如果确实想要创建多个窗口的例子,以下是一个简单的Python脚本,使用Gtk来创建多个窗口实例。每个窗口都可以独立打开和关闭,且具有自己的标题和大小。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class 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():
# 初始化GTK
Gtk.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`或其他容器小部件。
在GTK+中使用`GtkWindow`来创建新窗口,使用`GtkNotebook`来制作选项卡式界面,`GtkPaned`允许用户调整两个widget的大小,而`GtkFrame`为其中的内容提供了装饰性边框。
下面是一个简单的例子,它创建了一个主窗口(`MainWindow`),其中包含一个`GtkNotebook`、`GtkPaned`和`GtkFrame`的组合。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class 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)
# 创建Notebook
notebook = Gtk.Notebook()
self.add(notebook)
# 创建Paned窗口
paned = Gtk.Paned()
notebook.append_page(paned, Gtk.Label('Tab 1'))
# 在Paned窗口的一侧添加Frame
frame1 = Gtk.Frame()
frame1.set_size_request(200, -1) # 宽200,高度不设限
frame1.add(Gtk.Label("Left Pane Content"))
paned.add1(frame1)
# 在另一侧添加Frame
frame2 = 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+创建基本的组件和布局。
要在Python中创建一个使用了多个子窗口(GtkWindow)并在这些子窗口中使用GtkNotebook、GtkPaned、GtkStack的GTK+程序,可以基于以下概念性的代码。以下是一个简单的示例,它会创建一个主窗口和一个带有多个组件的子窗口。该例子使用 PyGObject,它是 GTK+ 3 的 Python 绑定。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class 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)
# 第一页,使用 GtkPaned
paned_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"))
# 第二页,使用 GtkStack
stack_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 已被正确安装,如前面的解答中所述。这里的示例可能会需要根据具体需求和设计进行调整,但该代码提供了在子窗口中使用多个不同组件的基本模式。