【python】GtkWindow程序

一、多个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 已被正确安装,如前面的解答中所述。这里的示例可能会需要根据具体需求和设计进行调整,但该代码提供了在子窗口中使用多个不同组件的基本模式。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教育能打破阶层固化吗

中式教育以应试为核心,强调知识的灌输和学生被动接受。随着社会的发展,中式教育的短板逐渐显现,创新能力的缺乏、对记忆的过度依赖、忽视个体差异等问题日益突出。 建议所有大学生都能去看看《上海交通大学生存手册》,它道出了中…

日常学习之:vue + django + docker + heroku 对后端项目 / 前后端整体项目进行部署

文章目录 使用 docker 在 heroku 上单独部署 vue 前端使用 docker 在 heroku 上单独部署 django 后端创建 heroku 项目构建 Dockerfile设置 settings.pydatabase静态文件管理安全设置applicaiton & 中间件配置 设置 requirements.txtheroku container 部署应用 前后端分别部…

(自用)learnOpenGL学习总结-高级OpenGL-模板测试

模板测试 模板测试简单来说就是一个mask,根据你的mask来保留或者丢弃片段。 那么可以用来显示什么功能呢?剪切,镂空、透明度等操作。 和深度缓冲的关系是: 先片段着色器,然后进入深度测试,最后加入模板测…

2023年中国工控自动化市场现状及竞争分析,美日占主角,国产品牌初崭头角

工控自动化是一种运用控制理论、仪器仪表理论、计算机和信息技术,对工业生产过程实现检测、控制、优化、调度、管理和决策,达到增加产量、提高质量、降低消耗、确保安全等目的综合性技术。产品应用领域广泛,可分为OEM型行业和项目型行业。 近…

2024年最新 MySQL的下载、安装、启动与停止

一、MySQL的下载 MySQL最常用的2个版本: 社区版:免费开源,自由下载,不提供官方技术支持,大多数普通用户选择这个即可。企业版:需要付费,不能在线下载,可以使用30天,提供…

aio-max-nr达到上限导致数据库性能问题

问题说明: rac数据库节点一表面上看由于归档等待事件导致业务性能问题。 问题分析过程: 查看awr报告top事件,等待事件主要为归档切换问题: 查看事件,归档等待达到20多分钟 检查节点alert日志发现,最…

Linux第37步_解决“Boot interface 6 not supported”之问题

在使用USB OTG将“自己移植的固件”烧写到eMMC中时,串口会输出“Boot interface 6 not supported”,发现很多人踩坑,我也一样。 见下图: 解决办法: 1、打开终端 输入“ls回车”,列出当前目录下所有的文件…

SpringCloud-高级篇(十六)

前面学习了Lua的语法,就可以在nginx去做编程,去实现nginx类里面的业务,查询Redis,查询tomcat等 ,业务逻辑的编写依赖于其他组件,这些组件会用到OpenResty的工具去实现 (1)安装OpenRe…

C++(16)——vector的模拟实现

前面的文章中,给出了对于的模拟实现,本篇文章将给出关于的模拟实现。 目录 1.基本框架: 2. 返回值与迭代器: 2.1 返回值capacity与size: 2.2 两种迭代器iterator和const_iterator: 3. 扩容与push_back与pop_back&#xff1a…

后端学习:数据库MySQL学习

数据库简介 数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库。   接下来,我们来学习Mysql的数据模型,数据库是如何来存储和管理数据的。在介绍 Mysql的数据模型之前,需要先了解一个概念&#xf…

log4j2 配置入门介绍

配置 将日志请求插入到应用程序代码中需要进行大量的计划和工作。 观察表明,大约4%的代码专门用于日志记录。因此,即使是中等规模的应用程序也会在其代码中嵌入数千条日志记录语句。 考虑到它们的数量,必须管理这些日志语句,而…

【QT+QGIS跨平台编译】之十三:【giflib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、giflib介绍二、文件下载三、文件分析四、pro文件五、编译实践一、giflib介绍 GIFlib(又称为Libgif)是一个开源的C语言库,用于处理GIF图像格式。它提供了一组函数和工具,使得开发者可以读取、写入和操作GIF图像文件。 GIFlib支持GIF87a和GIF89a两种版本的GIF格…

【项目管理】CMMI-管理性能与度量

管理性能与度量 (Managing Performance and Measurement, MPM)的目的在于开发和维持度量能力来管理开发过程性能,以实现公司业务目标,更直接来说,将管理和改进工作集中在成本、进度表和质量性能上,最大限度地提高业务投资回报。 1…

linux(进程概念)

目录 前言: 正文 冯诺依曼体系结构 操作系统 (Operator System) 概念 目的 定位 如何理解“管理” 进程组织 基本概念 内核数据结构 代码和数据 查看进程 ps指令 top指令 父子进程 fork创建进程 小结: 前…

【Redis】Redis有哪些适合的场景

🍎个人博客:个人主页 🏆个人专栏:Redis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 (1)会话缓存(Session Cache) (2)全页缓存(FPC…

深入理解TCP网络协议(1)

目录 1.TCP协议的段格式 2.TCP原理 2.1确认应答 2.2超时重传 3.三次握手(重点) 4.四次挥手 1.TCP协议的段格式 我们先来观察一下TCP协议的段格式图解: 源/目的端口号:标识数据从哪个进程来,到哪个进程去 32位序号/32位确认号:TCP会话的每一端都包含一个32位&#xff08…

Windows 7 x64 SP1 安装 Google Chrome 109.0.5414.120 (正式版本) (64 位)

1 使用 IE 浏览器 输入网址 Google Chrome 网络浏览器得益于 Google 智能工具,Chrome 现在更易用、更安全、更快速。https://www.google.cn/chrome/,点击下载 Chrome。 2 点击 接受并安装。 3 提示。 4 保存。 5 双击 运行 ChromeSetup.exe。 6 等待安…

9.异步爬虫

异步爬虫可以理解为非只单线程爬虫 我们下面做个例子,之前我们通过单线程爬取过梨视频 https://blog.csdn.net/potato123232/article/details/135672504 在保存视频的时候会慢一些,为了提升效率,我们使用异步爬虫爬取 目录 1 线程池 2 …

类和对象 第五部分第三小节:递增运算符重载

作用&#xff1a;通过重载递增运算符&#xff0c;实现自己的整型数据递增 代码案例 1.重载前置运算符 #include <iostream> #include <string> using namespace std;class MyInteger {friend ostream& operator<<(ostream& out, const MyInteger&…

简盒工具箱iapp源码

一款工具箱兼做软件库。 新增远程更新功能 修复了部分失效功能 修复了偶尔会卡在启动页的情况 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88776737 更多资源下载&#xff1a;关注我。