Kivy tutorial 003: Building a full GUI

news2024/11/16 19:49:31

Kivy tutorial 003: Building a full GUI – Kivy Blog

Central themes: Adding Widgets to one another
中心主题: 添加组件到另一个组件中

The tutorals so far have covered the very basics of a Kivy application; getting everything running, adding a Widget (the Label), and doing some customisation.
到目前为止,导师课已经涵盖了Kivy应用程序非常基本的元素;让所有的一切跑起来, 增加一个组件(label 标签),和做了一些个性化。

Let’s now combine some widgets to make a larger GUI. This tutorial will solely cover joining the widgets together, not making them do anything; this is covered in later tutorials.
现在让我们结合一些组件来制作一个更大GUI。 这节导师将单独地覆盖连接组件们到一起,不让它们干任何事, 以后的导师课会有涉及干其他的事。

Note

This tutorial will construct the GUI using entirely Python code. You can always do this with Python as described here, but normally we recommend using the easier, clearer and more concise kv language to construct widget trees. This will be covered fully in later tutorials.
这节导师课将构建GUI 通过整个使用Python代码。 你总是可以像python描述的这样干,但是常见的是我们使用更简单、清晰和更简洁的KV语言来重新命令构建组件树。这在以后的导师课中会被覆盖。

Our new task will be to build a simple calculator app; we’ll need Buttons for each of the numbers and mathematical operations, and a Label to display the result.

我们新的任务是构建一个简单地计算机app;我们将需要Buttons按钮给每个数字,并且自动地业务操作,和一个标签来展示结果。

Let’s start with a new basic app structure:让我们开始一个简单的app结构:

from kivy.app import App

class YourApp(App):

    def build(self):
        return None

YourApp().run()

Right now, you can run the code but the window will be empty because we didn’t add any widgets. Let’s do that now, but we no longer want just a Label; our app will be made of multiple Widgets next to one another. For this, we use Layout classes; let’s start with the following:
现在,你可以运行代码,但是窗口将是空的因为我们没有添加任何的组件。让我们现在添加些, 但是我们不再只想要一个Label标签;我们的App将有许多复杂的组件一个挨着一个的组成。为了这点,我们使用Layout 布局类,让我们像下面这样开始:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout


class YourApp(App):
    def build(self):
        layout = BoxLayout(orientation='vertical')
        b1 = Button(text='button 1')
        b2 = Button(text='button 2')

        layout.add_widget(b1)
        layout.add_widget(b2)

        return layout


YourApp().run()

We’re now instantiating three Widget classes; the BoxLayout and two Buttons. Just like with the Label, each one can be customised by passing properties. The only new one here is the orientation of the BoxLayout; passing 'vertical' means it will place its children below one another. The Buttons are internally a Label with a background image and touch behaviour (you can see this in the Button documentation, check the ‘Bases:’), so we can use the Label’s text property just like before.
现在我们实例化了3个组件类; Boxlayout 布局 和2个 Buttons按钮。 就像Label一样,每个组件类都可以通过传递属性实现自定义。 在这唯一新的是Boxlayout布局的 orientation方向;传递 'vertical' 意味着它将从上到下的放置它的子类。 按钮是在一个Label标签内部同一个背景图篇和touch behaviour 触摸行为(你可以在Button文档中看到这块儿,检查'Bases'),因此我们可以使用Label的text属性就像之前一样。

After instantiating the widgets, we can add them to one another. You can almost always add any widget instance to any other in exactly this way. When you do so, the newly added widgets will appear on the screen, and you’ll be able to interact with them. The widget you add to is called the parent widget, and the added widget (in this case the Buttons) is the child widget.
在组件的实例化之后,我们可以添加它们到另一个中。你几乎总是可以添加任何组件实例给另一个通过这种方式。当你这么干的时候,新添加的组件将在屏幕上出现,并且你将能够和它们互动。添加到其中的部件称为父部件,被添加的部件(在本例中为Buttons)是子部件。

This code should give you something like the following image. You can also now click the buttons to see their colour change; this behaviour is automatic, they don’t do anything else yet.
这代码应该给你像下面图片这样。 现在你也可以点击按钮来看看它们该百年的颜色, 这行为是自动地,它们不做其它的事情。

App output showing 2 buttons

Try setting the BoxLayout orientation to 'horizontal' to see how it affects the result.
试着设定Boxlayout布局方向到'horizontal'水平的来看看它如何形象结果。

Resize the window, and note that the sizes and positions of the buttons update automatically. This happens because the BoxLayout repositions and resizes its children when its own size changes, and because it is the root widget its own size tracks that of the window. This is very important! If you replace the BoxLayout with a plain Widget (from kivy.uix.widget import Widget) this will not happen, the Buttons will both have their default position and size in the bottom left of the window. For this reason, you’ll want to use Layouts like BoxLayout all the time to automatically position things, though you can also create your own automatic bindings (see later tutorials on Kivy Properties).
重新设置窗口的大小,并且注意自动添加的按钮的位置和大小。因为Boxlayout布局重新设置位置和重新设置大小给它的子类,当它自己的大小改变 ,也因为根组件它自己的大小跟随着窗口。这是非常重要的!如果你将plain组件替换Boxlayout布局(从kivy.uix.widget导入Widget)者将不会发生,按钮都将有它们默认的位置和大小在窗口的左边的底部。 因为这个原因,你将想使用Boxlayout布局一样总是自动地定位食物,尽管你也可以创建你自己的自动绑定(看之后的关于kivy属性的导师课)

With these basic ideas in hand, let’s proceed to add Widgets representing our entire calculator interface:
伴随着进行中的这些基础想法,让我们开展组件代表我们整个计算器界面:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label


class YourApp(App):
    def build(self):
        root_widget = BoxLayout(orientation='vertical')

        output_label = Label(size_hint_y=1)

        button_symbols = ('1', '2', '3', '+',
                          '4', '5', '6', '-',
                          '7', '8', '9', '.',
                          '0', '*', '/', '=')

        button_grid = GridLayout(cols=4, size_hint_y=2)
        for symbol in button_symbols:
            button_grid.add_widget(Button(text=symbol))

        clear_button = Button(text='clear', size_hint_y=None,
                              height=100)

        root_widget.add_widget(output_label)
        root_widget.add_widget(button_grid)
        root_widget.add_widget(clear_button)

        return root_widget


YourApp().run()

This introduces a couple of new ideas; the GridLayout is a new layout class that arranges its child widgets in (you guessed it) a grid. We’ve set its cols` property to ``4`, which means that every 4 widgets we add it will start a new row. Since we add 16 buttons altogether, that’s 4 rows of 4.
这介绍了一些新的想法; GridLayout布局 是一个新的布局类,这类排列它的子类组件在一个(你猜的)网格中。 我们已经设置它的 ‘cols’列 属性是‘4’,这意味着我们添加的每4个组件它将重新起一行。自从我们一起添加了16个按钮,那是4行,每行4个按钮。

The other new idea here is the size_hint_y setting for the output_label and button_grid. All widgets have a size_hint_x (horizontal) and size_hint_y (vertical) that you can set. They are used by Layout classes to set relative sizes; in this case, the the one with size_hint_y=2 takes up twice as much vertical space as the one with size_hint_y=1.
这儿另一种新的想法是 size_hint_y 设置给output_label 和 button_grid。所有的组件都有一个你可以设置的size_hint_x(水平的) 和size_hint_y(竖直的)。它们被Layout布局类用来设置相对的size大小;在这案例中,size_hint_y=2的组件比size_hint_y=1的组件在竖直方向上多占用2倍的空间。

You can also override the size hint to set a manual width and/or height for your Widget, but you must do this explicitly, as shown here with the ‘clear’ button. By setting size_hint_y=None, we ensure that its height=100 is never overridden, this Button will have a height of 100 pixels no matter what.

你可以通过重写大小提示(size hint)来为你的控件设置手动的 宽度 和/或 高度,但你必须明确地这样做,就像这里的“清除”按钮所示。通过设置size_hint_y=None,我们确保它的height=100设置不会被覆盖,因此这个按钮将始终具有100像素的高度,无论其他条件如何。

这段翻译解释了在一个图形用户界面(GUI)框架(如Kivy)中,如何为一个控件(如按钮)设置固定的尺寸。size_hint属性通常用于按比例分配控件的尺寸,而设置size_hint_y=None则告诉框架不要按比例调整这个控件的高度,而是使用直接指定的height值。这样,无论其他因素如何变化,该控件都将保持指定的固定高度。

Your final code should look something like the image below. You can resize the window to see all the components move around and resize automatically, thanks to the use of Layouts for positioning.

你最终的代码应该看起来和下面图片一样。你可以重新定义窗口的大小来看看所有的部件在周围移动并且重新自动地定义大小,感谢Layout布局的positioning的定位。
 

Calculator gui image

You are strongly encouraged to experiment with modifying this code to see what happens. All the concepts used here are standard when working with Kivy widget positioning.
非常鼓励你来体验修改这代码来看看将发生啥。在所有这里使用的概念里都是Kivy组件的positioning定位使用时的标准。

The calculator GUI clearly doesn’t do anything yet (although you can click on the buttons due to their default behaviour). Adding some functionality is covered in the next tutorial.
计算机的GUI非常清晰但是啥也干不了, 你可以点击折现按钮因为它们本身的默认behaviour行为。在下一节的导师课中涵盖了一些添加的一些功能。

Full code

your_filename.py:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label


class YourApp(App):
    def build(self):
        root_widget = BoxLayout(orientation='vertical')

        output_label = Label(size_hint_y=1)

        button_symbols = ('1', '2', '3', '+',
                          '4', '5', '6', '-',
                          '7', '8', '9', '.',
                          '0', '*', '/', '=')

        button_grid = GridLayout(cols=4, size_hint_y=2)
        for symbol in button_symbols:
            button_grid.add_widget(Button(text=symbol))

        clear_button = Button(text='clear', size_hint_y=None,
                              height=100)

        root_widget.add_widget(output_label)
        root_widget.add_widget(button_grid)
        root_widget.add_widget(clear_button)

        return root_widget


YourApp().run()

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

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

相关文章

【linux】TCP交流状态变迁及一些函数调用

代码 登录 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/commit/50bb00d844b9423c9bacf44d9b06604fab941686 https://gitee.com/r77683962/linux-6.9.0/raw/50bb00d844b9423c9bacf44d9b06604fab941686/dmesg_log/kern_tcp_with_state.log 从打印的日志,…

石油化工厂为什么要用专业防爆手机?

防爆手机之所以必须使用专业设计的产品,主要是出于安全考虑,以防止在易燃易爆环境中因手机使用不当引发爆炸事故。以下几点详细解释了使用专业化工防爆手机的必要性: 本质安全设计:顶坚专业防爆手机采用了本质安全(本安…

线程版服务器实现(pthread_server)

用到的所有方法所需要的参数可以在wrap.c文件中查询&#xff0c;wrap中找不到的直接通过man手册查询 1.首先介绍一下我自己写的包裹文件&#xff0c;里面有各种在可能要用到的方法 wrap.c: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #…

【IDEA】单项目多启动

IDEA 允许多次运行项目 一般来说一个项目仅允许启动一次&#xff0c;启动后它的启动按钮就会变成重启按钮&#xff0c;但是一些情况下我们可能需要启动多个客户端&#xff0c;可以用于模拟多个网络请求的发送等&#xff0c;多启动的开启方式如下&#xff1a; 2023.x 之后的版本…

常见网络攻击威胁分享

今天我来分享一下比较常见的网络攻击形式&#xff0c; ARP 欺骗攻击、CC 攻击和 DDoS 流量攻击是较为常见且危害巨大的攻击方式。 一、ARP欺骗攻击 ARP&#xff08;AddressResolutionProtocol&#xff0c;地址解析协议&#xff09;是用于将IP地址转换为MAC地址的协议。ARP欺骗…

web-原生Ajax

概念: Asynchronous JavaScript And XML&#xff0c;异步的JavaScript和XML。 作用: 数据交换:通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的技术&#xff0c;如…

秋招突击——6/20——复习{(单调队列优化)——最大子序列和,背包问题——宠物小精灵收服问题}——新作{两两交换链表中的节点}

文章目录 引言复习单调队列优化——最大子序列和思路分析实现代码参考实现 背包问题——宠物小精灵的收服问题个人实现参考实现 新作两两交换链表中的节点个人实现参考实现 删除有序数组中的重复项个人实现知识补全迭代器的访问和控制vector删除特定的元素erasevector底层删除元…

私有化地图离线部署方案之查询定位服务

私有化地图离线部署整体解决方案&#xff0c;除硬件之外&#xff0c;一般主要由基础地图服务、查询定位服务、路径规划服务和高程检索服务构成。 其中&#xff0c;查询定位服务是指地理编码与逆地理编码服务。 在《私有化地图离线部署方案之基础地图服务》一文中&#xff0c;…

Python 挖坑式填充Excel模板内容(包括页眉/SheetName/logo)

纵览 Python处理Excel的方式--解压缩方式1、导包2、对模板文件进行解压缩3、对解压缩后文件层级进行介绍4、准备需要载入的数据5、模板挖坑6、运行替换代码7、压缩文件8、生成文件9、完成代码10、可能遇到的问题 结语 Python处理Excel的方式–解压缩方式 在处理Excel中过程中&…

Origin做聚类分析并利用聚类插件绘制热力图

1.聚类分析 1.1 K均值聚类 step1、首先进行归一化&#xff0c;具体步骤如图1-1所示&#xff1a; 图1-1 操作后得到归一化值如图1-2所示&#xff1a; 图1-2 step2、执行K均值聚类分析&#xff0c;如图1-3所示&#xff0c;选中聚类列&#xff0c;接着点击“统计”—“多变量分析…

Linux—LVM与磁盘配额

目录 一、LVM 1、LVM概念 2、LVM逻辑卷核心组件 3、LVM管理命令 二、LVM操作主要命令步骤 1、添加硬盘 2、新建分区&#xff0c;并修改分区类型 3、新建物理卷&#xff08;PV&#xff09; 4、新建卷组&#xff08;VG&#xff09; 5、新建逻辑卷&#xff08;LV&#xff0…

pgsql的套接字文件不存在

问题&#xff1a;psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory 解决方式&#xff1a; 检查 postgresql.conf 文件中的 unix_socket_directories 设置&#xff0c;确保它包含 /tmp 或者你期望的目录。 重…

网站安装HTTPS证书的重要性以及如何申请

在互联网时代&#xff0c;数据安全成为了企业和个人关注的焦点。HTTPS证书作为网站安全的重要保障&#xff0c;其重要性不言而喻。下面将探讨HTTPS证书的重要性&#xff0c;并介绍如何申请HTTPS证书&#xff0c;构建一个更安全、更信任的网络环境。 一、HTTPS证书的重要性 1.…

改网络ip地址有什么用

在数字化时代&#xff0c;网络IP地址是每个网络设备和终端在互联网上的唯一标识符。然而&#xff0c;有时出于安全、隐私或网络管理的需要&#xff0c;我们可能需要更改网络IP地址。例如很多小伙伴会选择使用虎观代理IP更改电脑或手机设备上的网络IP地址&#xff0c;那么&#…

中霖教育怎么样?中霖教育好吗?

中霖教育怎么样?中霖教育好吗? 中霖教育包括师资力量、课程设置、教学方法等都是经过不断完善来制定的&#xff0c;我们拥有专业且经验丰富的师资队伍&#xff0c;在教学过程中更注重个性化教学方式&#xff0c;针对每个学员的需求和学习情况制定专属的学习计划。 无论是在…

【源码】最新源支付系统源码 V7版全开源 免授权 附搭建教程

最新源支付系统源码_V7版全开源_免授权_附详细搭建教程_站长亲测 YPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的thin…

数据库三大范式是什么?你是按什么原则去建数据库表的?

引言&#xff1a;数据库设计是任何信息系统中至关重要的一环&#xff0c;它直接影响着数据管理的效率、系统的性能以及信息的完整性和安全性。在当今数字化和信息化程度不断提升的背景下&#xff0c;正确和高效的数据库设计更显得至关重要。本文旨在探讨数据库设计中的核心理论…

【编译原理】绪论

1.计算机程序语言以及编译 编译是对高级语言的翻译 源程序是句子的集合&#xff0c;树可以较好的反应句子的结构 编译程序是一种翻译程序 2.编号器在语言处理系统中的位置 可重定位&#xff1a;在内存中存放的起始位置不是固定的 加载器&#xff1a;修改可重定位地址&#x…

养殖自动化管理系统:开启智慧养殖新篇章

在现代农业的快速演进中&#xff0c;养殖业正经历一场前所未有的技术革命。养殖自动化管理系统&#xff0c;作为这场变革的前沿科技&#xff0c;正逐步成为推动行业高效、环保、可持续发展的关键力量。本文将深入探讨自动化养殖系统如何通过精准管理、智能监控、数据驱动决策&a…

云原生架构:未来应用程序设计和部署的革新

目录 前言1. 云原生架构的概述1.1 什么是云原生架构1.2 云原生架构的核心理念 2. 云原生架构的核心特征2.1 容器化应用2.2 微服务架构2.3 自动化管理 3. 云原生架构的优势3.1 弹性和可伸缩性3.2 高可用性和容错性3.3 快速交付和持续部署 4. 实施云原生架构的关键技术4.1 容器编…