GTK的布局容器分为两种,一种是single-child容器,继承自Gtk.Bin,另一种是继承自Gtk.Container的multiple-child容器。关于这两类Gtk.Bin和Gtk.Container的层级结构如下:

与翻译之前的文章不同,我这里便引入glade这个软件,这是一个UI设计器,gtk是声明式UI,与wpf类似是在配置文件中写好的。当然也可以用代码写,但是这样无法做到UI与后台分离。如果是ubuntu的话,使用sudo apt install glade安装galde即可。

最常用的布局容器是垂直或水平框(Gtk.Box)和网格(Gtk.Grid)

Gtk.Box

打开glade,从“顶层”中选择window添加上,再从“容器”中选择一个box添加到window上,默认box是3条、竖向排列。

保存下,用任一文本编辑器打开刚刚保存的.glade文件就会发现其实这是个xml文件

保存后放到python文件同目录下,使用下面的代码即可加载.glade文件的UI(为了效果,我给.glade文件添加了按钮、文本框和label)

import gi

gi.require_version("Gtk", "3.0")

from gi.repository import Gtk

class Handler:

def onDestroy(self, *args):

Gtk.main_quit()

def onButtonPressed(self, button):

print("Hello World!")

builder = Gtk.Builder()

builder.add_from_file("./MainUI.glade")

builder.connect_signals(Handler())

window = builder.get_object("MainWindow")

window.connect("destroy",Gtk.main_quit)

window.show_all()

Gtk.main()

说回Gtk.Box,使用python代码也是可以实现布局UI的,如下就是放置了两个button

gi.require_version("Gtk", "3.0")

from gi.repository import Gtk

class MyWindow(Gtk.Window):

def __init__(self):

Gtk.Window.__init__(self, title="Hello World")

# 设置容器之间的间隔是6个像素

self.box = Gtk.Box(spacing=6)

self.add(self.box)

self.button1 = Gtk.Button(label="Hello")

self.button1.connect("clicked", self.on_button1_clicked)

# 如果是垂直排列下面的函数就是添加button1到box从上向下放置,如果是横排就是从左到右放置

self.box.pack_start(self.button1, True, True, 0)

self.button2 = Gtk.Button(label="Goodbye")

self.button2.connect("clicked", self.on_button2_clicked)

# 如果是垂直排列下面的函数就是添加button2到box从下到上放置,如果是横排就是从右侧到左侧放置

self.box.pack_start(self.button2, True, True, 0)

def on_button1_clicked(self, widget):

print("Hello")

def on_button2_clicked(self, widget):

print("Goodbye")

win = MyWindow()

win.connect("destroy", Gtk.main_quit)

win.show_all()

Gtk.main()

Grid

顾名思义就是网格布局,wpf用的最多的就是grid,使用Gtk.Grid.attach()方法添加子项,子项可以跨越多行或者多列。Gtk.Grid.attach()有如下参数

可以使用Gtk.Grid.attach_next_to()添加一个子项靠近当前已经存在的子项

下面是示例

import gi

gi.require_version("Gtk", "3.0")

from gi.repository import Gtk

class GridWindow(Gtk.Window):

def __init__(self):

Gtk.Window.__init__(self, title="Grid Example")

grid = Gtk.Grid()

self.add(grid)

button1 = Gtk.Button(label="Button 1")

button2 = Gtk.Button(label="Button 2")

button3 = Gtk.Button(label="Button 3")

button4 = Gtk.Button(label="Button 4")

button5 = Gtk.Button(label="Button 5")

button6 = Gtk.Button(label="Button 6")

grid.add(button1)

grid.attach(button2, 1, 0, 2, 1)

grid.attach_next_to(button3, button1, Gtk.PositionType.BOTTOM, 1, 2)

grid.attach_next_to(button4, button3, Gtk.PositionType.RIGHT, 2, 1)

grid.attach(button5, 1, 2, 1, 1)

grid.attach_next_to(button6, button5, Gtk.PositionType.RIGHT, 1, 1)

win = GridWindow()

win.connect("destroy", Gtk.main_quit)

win.show_all()

Gtk.main()

其他

listbox

stack stackswitcher

headerbar

notebook

python gtk页面布局_Python GTK + 3教程 学习笔记 ——(5)布局 与 glade相关推荐

  1. python 廖学峰教程_python廖雪峰教程 学习笔记

    如何用字符来描述字符: \d匹配数字 digit \w匹配字母或数字 word \s可以匹配空格 space * 表示任意个字符, +表示至少一个字符 ?表示0个或1个字符, {n} 表示n个字符, ...

  2. python datetime需要安装_Python全栈工程师学习笔记 | Django的模型层

    Model模型 模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和行为. 通常,每个模型对应数据库中唯一的一张表. 每个模型都是django.db.models.Model的一个Py ...

  3. 无敌python爬虫教程学习笔记(一)

    python爬虫系列文章目录 无敌python爬虫教程学习笔记(一) 无敌python爬虫教程学习笔记(二) 无敌python爬虫教程学习笔记(三) 无敌python爬虫教程学习笔记(四) 本文目录 ...

  4. 无敌python爬虫教程学习笔记(二)

    系列文章目录 无敌python爬虫教程学习笔记(一) 无敌python爬虫教程学习笔记(二) 无敌python爬虫教程学习笔记(三) 无敌python爬虫教程学习笔记(四) 手刃一个小爬虫 系列文章目 ...

  5. Python基础教程-菜鸟教程学习笔记1

    Python基础教程-菜鸟教程学习笔记1 文章目录 Python基础教程-菜鸟教程学习笔记1 前言 Python 简介 1. 第一个Python程序 2. Python 中文编码 3. 基本语法 1) ...

  6. 廖雪峰Git教程学习笔记

    廖雪峰git简单教程学习笔记 教程地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b ...

  7. CSS 学习笔记 - 网格布局(栅格系统)

    CSS 学习笔记 - 网格布局(栅格系统) 开启网格模式 基本概念 属性说明 容器属性 内容属性 效果展示 grid-template-rows.grid-template-columns 基本用法 ...

  8. Linux教程学习笔记

    Linux教程学习笔记 目录 Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 ...

  9. 黑马程序员Java教程学习笔记(五)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(五) 日期时间:Date.Sim ...

  10. 黑马程序员Java教程学习笔记(三)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(三) 面向对象:设计对象.注意事 ...

最新文章

  1. Maven中jar版本冲突问题的解决
  2. 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )
  3. Javag工程师成神之路(2019正式版)
  4. SAP Spartacus的CMSPageGuard
  5. 如何使用Prometheus采集SAP ABAP Netweaver的应用日志数据
  6. .net函数查询_特来电智能分析平台动态查询架构创新实践
  7. 熟悉 ASP.NET MVC 类
  8. php代码加文件后缀,php中一行代码获取文件后缀名
  9. iOS 开发中,单款应用程序的最大可用内存是多少?
  10. POJ-1328 Radar Installation 贪心
  11. sqlalchemy连接和关闭数据库
  12. 中国羽绒服市场深度调查研究报告
  13. java main 参数解析_Java Main参数解析(Args4j)
  14. 模拟京东快递单号查询框
  15. 笔记本wifi共享出来能够连接但是没有网速
  16. matlab 太阳系仿真,三维仿真太阳系
  17. C++基础入门(一)
  18. Java SE到Java EE的学习转换
  19. Box2D翻译_第二章
  20. 关于FPN(特征金字塔网络)层间融合的理解

热门文章

  1. C#替换DataTable列名
  2. 第二周嵌入式课程总结
  3. 基于java的家庭收支管理系统
  4. 【金山卫士1.2】清理功能全面集成金山清理专家
  5. 迅雷将启动收费下载服务 因版权问题屡次被告
  6. 基于I.MX6UL平台的WIFI模块AP6214A 驱动移植
  7. Java servlet视频教程,完整体系课程-动力节点
  8. 激光SLAM导航系列(二)SLAM与导航系统框架
  9. 信息系统项目管理系列之五:项目整体管理
  10. 如何将统一参考文献的格式?