一步一步教你如何使用Python实现UI框架

发布于:2024-10-24 编辑:匿名 来源:网络

其实我个人很抗拒使用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("", self.on_focus_in) self.widget.bind("", self.on_focus_out) if self.isPassWord: self.widget["show"] = "*" # 隐藏密码 return self.widget def on_focus_in(self, event): if self.widget.get() == self.placeholder: self.widget.delete(0, tk.END) def on_focus_out(self, event): 如果不是 self.widget.get(): self. widget.insert(0, self.placeholder)class 按钮: def __init__(self, text, on_click): self.text = text self.on_click = on_click self.widget = None def render(self,parent): if self.widget is None: self.widget = tk.Button(parent, text=self.text, command=self.on_click, font=( 'Arial', 12)) return self.widget# 应用类class App: def __init__(self,标题,组件): self.title = 标题 self.components = 组件 self.root = tk.Tk() self.root.title(title) def run(self): 对于 self.components 中的组件: widget = component.render (self.root) widget.pack(pady=5) self.root.mainloop()#创建登录页面的组件username_label = Label(text="用户名:")username_entry = Input(placeholder="输入您的用户名")password_label = Label(text="密码:")password_entry = Input(placeholder="", isPassWord=True)login_button = Button("登录", lambda: print (f"使用 {username_entry.widget.get()} 登录"))# 创建并运行应用程序 app = App("登录页面", [username_label, username_entry,password_label,password_entry, login_button])app.run()看一下:没有什么意外的图,结果肯定是测试成功了,至少看到了一个声明性的架子,但是进来了一个我们家的布局组件来管理组件的放置。

是地道的,虽然组件也不是不能用,但是我们添加一个布局组件,比如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方式,但仍有巨大差距。

没有办法。这就是语言之间的差异。

差距,嗯,这是一个不可逾越的差距,但并不代表不可能。一定有一位大师能够找到办法使之成为可能。

唯一的问题是这种代驾服务是否值得。我正在参加腾讯科技创造特训营第四期有奖征文比赛。

一步一步教你如何使用Python实现UI框架

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 投资世界24h-周鸿祎VC来了;据报道,李学凌和雷军欲将寰聚集团私有化;爱奇艺取消未来几年偶像选秀节目

    投资世界24h-周鸿祎VC来了;据报道,李学凌和雷军欲将寰聚集团私有化;爱奇艺取消未来几年偶像选秀节目

    延长阅读时间:8月27日周五重要消息周鸿祎VC也来了。 8月23日,中国基金管理业协会发布的最新数据显示,360(北京)私募基金管理有限公司已于8月20日正式完成注册,机构类型为:私募、创业投资基金管理人。 这家公司刚刚注册成立一个多月前,由360科技集团全资拥有。 这是集团

    06-18

  • AI变形金刚训练营:开启阿里云白练

    AI变形金刚训练营:开启阿里云白练

    请使用阿里云大师账号进入阿里云白练产品首页,点击【前往购买】。 【仅主账号可以申请,RAM子账号无法申请】首次进入产品页面时,产品默认提供旗舰版能力。 购买期限最长可达1年,产品版本费0元。 【RAM子账号需要授予AliyunSFMFullAccess权限才能下单。 建议使用主账号下单

    06-18

  • 众信旅游上市 唐古拉投资和九鼎投资获得退出

    众信旅游上市 唐古拉投资和九鼎投资获得退出

    有信旅游上市,唐古拉投资、九鼎投资退出。 2019年1月23日,北京友信国际旅行社股份有限公司在深圳中小企业板挂牌上市。 北京中信国际旅行社有限公司(简称“中信旅游”)是经国家旅游局、北京市工商行政管理局批准成立的具有独立法人资格的股份制企业。 注册资本1万元,特许

    06-18

  • 短视频数据公司“一框”获1000万元Pre-A轮融资,推出原生广告系统探索商业化

    短视频数据公司“一框”获1000万元Pre-A轮融资,推出原生广告系统探索商业化

    投资界1月5日消息,据36氪报道,短视频数据公司“一帧”近期获得1万元Pre-A轮融资,投资方尚未公布。 此前,今年8月曾获得1万元天使轮融资。   一-帧平台是一款为视频平台提供短视频数据支持和视频运营管理服务的C端工具产品,该产品于2019年7月28日正式上线。 目前拥有帧分

    06-17

  • 人民日报创意海报引发猜测:周一家驹见?

    人民日报创意海报引发猜测:周一家驹见?

    在报纸上发布广告已不再是什么新鲜事,但总有一些品牌创意十足、引人注目。 12月16日,金立手机包有《人民日报》四页,将一张海报分成四部分发布!看到广告后,不少网友惊叹创意之新颖,认出广告上的两个人物就是Beyond乐队的黄家强和黄家驹。 大家都在猜测:阔别22年的家驹真

    06-18

  • 2021年青年创新创业联盟座谈交流活动在北京举行

    2021年青年创新创业联盟座谈交流活动在北京举行

    12月8日,2021年青年创新创业联盟(以下简称青年创业联盟)座谈交流活动在北京举行。 中国科协党组成员、书记处书记吕昭平出席并讲话。 本次活动由优客工场青年联盟主席创始人和董事长毛大庆主持。 吕昭平在致辞中指出,两年来,青年创新创业联盟积极开展工作,搭建对接和服务

    06-18

  • 南亚在线高等教育公司upGrad获淡马锡投资1.2亿美元投资

    南亚在线高等教育公司upGrad获淡马锡投资1.2亿美元投资

    投资界(ID:pedaily)4月27日消息,南亚最大在线高等教育公司upGrad今日宣布获得淡马锡控股1.2亿美元融资总部位于新加坡的全球投资公司。 淡马锡)筹集了 1.2 亿美元。 upGrad计划利用新资金进一步加强团队、拓展全球市场运营、增强技术和产品能力、寻求并购机会、扩大印度大

    06-18

  • 奈雪的茶预计将于6月23日为香港IPO定价

    奈雪的茶预计将于6月23日为香港IPO定价

    奈雪的茶预计将于6月23日为香港IPO定价。

    06-17

  • 掌上灵通股价重回1美元,符合纳斯达克上市要求

    掌上灵通股价重回1美元,符合纳斯达克上市要求

    掌上灵通股价重回1美元,符合纳斯达克上市要求。 据外媒报道,今天,灵通网(纳斯达克股票代码:LTON)宣布,公司已收到纳斯达克证券市场的通知,已重新遵守纳斯达克市场规则A(1)每股1元的最低购买价格。

    06-17

  • 全球最大童装DTC品牌PatPat宣布完成5.1亿美元C轮、D轮融资

    全球最大童装DTC品牌PatPat宣布完成5.1亿美元C轮、D轮融资

    投资界(ID:pedaily)7月19日消息,全球最大童装DTC品牌PatPat宣布完成5.1亿美元C轮、D轮融资完成5.1亿美元C轮融资、D轮融资和D轮融资,Index Capital继续为独家投资者。 公司表示,C轮融资由今日资本、泛大西洋资本、鼎晖百富联合领投,SIG海纳亚洲、Ocean Link、耀明资本跟

    06-17

  • 第二届CBDT2024中国出海品牌数字科技峰会全面启动,将于8月9日起航!

    第二届CBDT2024中国出海品牌数字科技峰会全面启动,将于8月9日起航!

    峰会背景在当今全球化和数字化交织的时代,中国品牌出海面临着前所未有的机遇和挑战。 随着中国经济的快速增长和对外开放的不断深入,中国品牌在全球市场的影响力显着提升。 许多中国品牌已成为国际市场的重要参与者,如华为、大疆、Shine、小米、安克创新等海外品牌。 他们在

    06-17

  • 卡布电子已完成近亿元A轮融资,投资方为华润资本、明石资本和施能资本,

    卡布电子已完成近亿元A轮融资,投资方为华润资本、明石资本和施能资本,

    投资界消息,国内高端电阻制造商凯步电子宣布完成近亿元A轮融资。 本轮融资由华润资本、明石资本、动量资本投资。 此次融资资金将主要用于凯步子公司长沙瑞思电子科技的研发投入、产能扩张和人才引进,将自主品牌瑞思电阻的研发和生产能力提升到新的水平。 为了打造高水平团队

    06-18