投资世界24h-周鸿祎VC来了;据报道,李学凌和雷军欲将寰聚集团私有化;爱奇艺取消未来几年偶像选秀节目
06-18
其实我个人很抗拒使用Python实现UI框架,因为对于App应用来说,React Native、Flutter基本上是世界上公认的更合适的选择,而对于技术栈是Python的朋友来说,有一些流行的UI框架可以用来构建跨平台的桌面应用程序。其中一些框架包括Tkinter、PyQt、wxPython、Kivy等。
这些框架提供了创建窗口、按钮、文本框等UI元素的功能,并且可以在不同的操作系统上运行。不过我想说的是,如果别人有的话,你可以自己搭建一个来加深对这方面原理的理解。
这非常重要。能不能用好是一回事,能不能用好又是另一回事。
就是这样。作为一个Pythoner,你一定希望成为后者,所以我建议你看一下。
因此,通过学习本文,您可以学习如何自己用Python实现一个UI框架。经过深思熟虑,我决定使用 SwiftUI 在 Python 中实现一个基本的响应式 UI。
OK,我们的目标大概就是这样写。 SwiftUI 是一个声明式 UI 框架,允许开发人员以非常简洁直观的方式描述用户界面,而不是通过命令式代码操作 UI 元素。
在Python中,要创建类似的框架,我们需要考虑以下关键点: 渲染引擎:可以绘制基本图形元素的渲染引擎。这可以基于 OpenGL,或者使用现有的库,例如 Pygame、Pyglet 等。
事件处理:一个事件循环来处理用户输入,例如鼠标单击、键盘输入等。 组件系统:我们需要定义一个组件系统允许用户创建按钮、文本框、列表和其他 UI 元素。
数据绑定:我们需要实现一种将UI元素绑定到数据源的机制,以便当数据发生变化时UI能够自动更新。声明性语法:我们需要定义一个简洁的语法,允许用户以声明性的方式描述 UI。
布局系统:我们需要一个布局系统来自动处理组件的位置和大小。我该怎么说呢?实现这些东西确实很难,尤其是我们实现一个渲染引擎。
这么短的文章不太现实,但我们终于有了一些想法。千里之行,始于足下。
,让我们前进两步。站在Tkinter等巨人的肩膀上,实现一个极其简单的登录页面并进行验证。
为什么选择 Tkinter?这个是自带操作系统的,不用安装,也不占用磁盘空间。另一位确实更熟悉。
然后我们会对 Tkinter 进行稍微封装,并将其集成到声明式 UI 中。我们不会实现得太彻底,所以我们将Button、Label、Input进行封装,因为基于此我们可以实现一个简单的登录。
页。ok,代码如下:代码语言:javascript复制import tkinter as tk#声明式类组件class Label: def __init__(self, text): self.text = text self.widget = None def render(self,parent): if self .widget 为 None: self.widget = tk.Label(parent, justify="left", text=self.text, font=('Arial', 12)) return self.widgetclass 输入: def __init__(self, placeholder, isPassWord=False): self.placeholder = 占位符 self.widget = None self.isPassWord = isPassWord def render(self,parent): 如果 self.widget 为 None: self.widget = tk.Entry(parent, font=('Arial) ', 12)) self.widget.bind("
是地道的,虽然组件也不是不能用,但是我们添加一个布局组件,比如FlexLayout,毕竟我们熟悉了,我们添加一个布局类,FlexLayout,如下。当然,如果把FlexLayout都下载下来,我可能会抓狂,毕竟FlexLayout虽然好用,但是要写一个完整的却不是那么容易的,所以我只写了一个极其简单的。
代码语言:javascript copy class FlexLayout: def __init__(self, Direction='row', justify='start',align='start'): self.direction = 方向 self.justify = justify self.align =align self.children = [] self.widget = None def add(self, component): self.children.append(component) def render(self, Parent): 如果 self.widget 为 None: self.widget = tk.Frame(parent) self .widget.pack(fill='both', Expand=True) for self.children 中的子组件: widget = child.render(self.widget) if self.direction == 'row': widget.pack(side='left ', fill='both', Expand=True) else: widget.pack(side='top', fill='both', Expand=True) return self.widget 然后,我们将前面的代码进行改造,主要是 Put Input 、Label、Button进入布局: 代码语言:javascript copy # 创建布局 username_frame = FlexLayout(direction='row'、justify='center'、align='center')username_frame.add(username_label)username_frame.add(username_entry)password_frame = FlexLayout(direction='row'、justify='center'、align='center ')password_frame.add(password_label)password_frame.add(password_entry)button_frame = FlexLayout(direction='row', justify='center',align='center')button_frame.add(login_button)# 创建并运行应用程序 app = app("登录页面",[用户名_frame,密码_frame,按钮_frame])app.run() 我们去看看效果:名称Label和Input成功放在一行。总结一下我们的声明式Python UI框架的最终实现效果基本上是有了些许提升,但是易用性恐怕还是有很大的差距。
就我个人而言,我认为编写 UI 的最佳方式应该是类似 HTML 的方式,无论是 React、Vue 还是更多。且不说原生的HTML方式,UI部分基本都是这么搞的,反正是有一点改进,一点点进步。
我建议你看看其他Python UI框架,比如kivy。其编写方式已基本趋向于web方式,但仍有巨大差距。
没有办法。这就是语言之间的差异。
差距,嗯,这是一个不可逾越的差距,但并不代表不可能。一定有一位大师能够找到办法使之成为可能。
唯一的问题是这种代驾服务是否值得。我正在参加腾讯科技创造特训营第四期有奖征文比赛。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-18
06-18
06-18
06-18
06-17
06-17
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用