【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,一经查实,立即删除!

相关文章

教育能打破阶层固化吗

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

23种设计模式使用场景分析

概述 网上关于设计模式的文章特别多,就不赘述了,我认为在敲代码的时候知道根据当前代码结构选择合适的设计模式是最重要的,知道了要使用哪个设计模式,就可以上网随便百度一下, 简述 对23中设计模式的分类 创建型模式…

日常学习之: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回车”,列出当前目录下所有的文件…

从centos镜像上创建具备SSH链接的Dockerfile

1. 创建目录,名字随意 mkdir dockfile cd dockfile 2. 创建名字为Dockerfile的文件 touch Dockerfile 3. 编辑内容如下 FROM centos MAINTAINER liufeng "liufgeoscene.cn"RUN /bin/echo root:123456|chpasswd RUN useradd test RUN /…

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…

Java运算符优先级

以下是一份Java运算符的优先级、类别和结合性的表格总结: 由于| 与制表符有冲突,所以用大写字母I代替| 优先级类别运算符结合性1括号( )从左向右2一元运算符!、~、、–从右向左3乘法、除法、取模*、/、%从左向右4加法、减法、-从左向右5位左移、位右移…

log4j2 配置入门介绍

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

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

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

倒计时71天

1.D-小红整数操作_牛客周赛 Round 30 (nowcoder.com) /****** __----~~~~~~~~~~~------___* . . ~~//...... __--~ ~~* -. \_|// |||\\…

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

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

军事博弈智能的核心是“诡”与“诈”

军事博弈智能的核心是“诡”与“诈”,意味着在军事博弈中,智能系统需要具备隐蔽、变化、欺骗和误导的能力,以达到取胜的目的。 首先,“诡”指的是智能系统需要具备隐蔽性和伪装变化能力,使对手难以获得准确的情报和判断…

JavaScript之ES6常用语法

文章目录 JavaScript之ES6常用语法1. 基本用法1.变量声明var、let、const1. 作用域2. 变量提升3. 声明次数4. const常量 2.模板字符串3.函数3**函数默认参数** 4.拓展的对象功能5.更方便的数据访问--解构6.Spread Operator 展开运算符7.import 和 export8. Promise9.Generators…

linux(进程概念)

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