一般的系统登统界面,设计好看一些,系统会增色不少,而常规的桌面程序,包括Web上的很多界面,都借助于背景图片的效果来增色添彩,本篇随笔介绍基于WxPython来做一个登录界面效果,并对系统登录界面在不同系统上(WIndows和MacOS) 进行测试对比,调整最佳的处理方案。

1、登录界面的设计

如前面所讲,我们在登录界面上放置一个图片占位全部,并在合适的位置上添加用户的登录账号和密码输入即可,剩下的就是对登录的请求和响应处理了。

我们基于WxPython来处理,放置图片一般就是用 wx.StaticBitmap,图片我们可以预先把他转换为嵌入的图片对象即可,如我们可以通过 img2py 命令来进行添加,把图片文件生成嵌入图片的对象。

如命令:

img2py -a -F -n quit public/images/quit.ico testimage.py

会在对应的地方生成或者最佳对应的图片内容,如下所示:

我们把它整合在对应的文件中使用即可。

创建一个继承 wx.Frame 但是没有常规对话框的标题框,默认的样式是 style=wx.DEFAULT_FRAME_STYLE

我们不需要标题框,让对话框界面自定义关闭按钮,让它更加好看,因此设置样式 style=wx.FRAME_NO_TASKBAR
下面是对话框的界面效果,我们先看一下。

其中关闭按钮,背景按钮、登录按钮,都是我们使用图片来处理的,按钮采用 wx.BitmapButton 来处理即可。

登录界面的窗体如下所示。

import testimage as testimage
import wx class LoginFrame(wx.Frame):
def __init__(self, parent, title):
super(LoginFrame, self).__init__(parent, title=title, size=(600, 375),
style=wx.FRAME_NO_TASKBAR)
self.InitUI() def InitUI(self):
panel = wx.Panel(self)
wx.StaticBitmap(panel, -1, testimage.login_backimg.Bitmap,
pos= (0, 0), size=(-1, -1), style=
wx.BORDER_NONE)
font = wx.Font(16, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD) self.userInput = wx.TextCtrl(panel, -1, value="admin", style=wx.TE_PROCESS_ENTER|wx.TE_CENTER|wx.CENTER, pos=(80, 330), size=(120, 28))
self.userInput.SetHint("输入账号")
self.userInput.SetFont(font) self.passwordInput = wx.TextCtrl(panel, -1, pos =(280, 330), size=(120, 28), style=wx.TE_PASSWORD| wx.TE_PROCESS_ENTER|wx.TE_CENTER)
self.passwordInput.SetHint("输入密码")
self.passwordInput.SetFont(font) loginButton =wx.BitmapButton(panel, -1, testimage.login_btn.Bitmap, pos= (410, 328),size= (92, 30))
self.Bind(wx.EVT_BUTTON, self.OnLogin, loginButton) quitButton = wx.BitmapButton(panel, -1, testimage.quit.Bitmap, pos= (560, 10),size= (32, 30))
self.Bind(wx.EVT_BUTTON, self.OnQuit, quitButton) self.Centre()

上面代码,在MacOS上运行界面,还算不错,不过在WIndows上,输入框和标签都无法正常显示,需要主动鼠标单击的时候,才出现,输入焦点也不太正常,后来搜索解决方案才发现是系统界面刷新的问题,不能使用 wx.StaticBitmap ,而需要使用刷新绘制背景图片的方式才可以正常,因此改动一下,使用 EVT_ERASE_BACKGROUND 事件处理的方式绘制背景方式。在初始化界面的时候,绑定该 EVT_ERASE_BACKGROUND 事件,如下代码所示。

self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
    def OnEraseBack(self, event: wx.EraseEvent):
dc = event.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
dc.DrawBitmap(testimage.login_backimg.Bitmap, 0, 0)

这样测试MacOS和WIndows均正常显示。

2、登录界面的优化及对接登录处理

稍作调整,在启动背景上添加一些文字显示,最终界面效果如下所示。

具体就是在绘制背景获得ClientDC 对象后绘制文本即可,如下代码所示。

    def OnEraseBack(self, event: wx.EraseEvent):
dc = event.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
dc.DrawBitmap(images.login_backimg.Bitmap, 0, 0) colour = wx.Colour(52, 94, 150)
dc.SetTextForeground(colour)
dc.SetFont(
wx.Font(16, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)
)
rect = wx.Rect(10, 210, 580, 30)
dc.DrawLabel(
"基于 wxPython 开发的 GUI 应用", rect, wx.ALIGN_CENTER | wx.ALIGN_TOP
)
rect = wx.Rect(10, 240, 580, 30)
dc.DrawLabel(
"COPYRIGHT 2024 广州爱奇迪软件科技有限公司",
rect,
wx.ALIGN_CENTER | wx.ALIGN_TOP,
)

为了对接实际的Python开发的FastApi后端,我们对增加一个login.py的API对接类,如下代码所示。

from .base_api import BaseApi
from entity.common import AjaxResponse, AuthenticateResult
import requests class Login(BaseApi):
"""登录处理--API接口类""" api_name = "login" def __init__(self):
super().__init__(self.api_name) def authenticate2(self, json) -> AuthenticateResult:
"""同步登录接口 :param json: 登录参数
{
"loginname": "string",
"password": "string",
"systemtype": "string",
}
:return: 登录结果
""" url = f"{self.base_url}/authenticate"
data = requests.post(url, json=json).json() result = AjaxResponse[AuthenticateResult].model_validate(data)
return result.result

增加登录过程的提示处理,代码如下所示。

    def on_login(self, event):
self.LoginSync() def LoginSync(self):
# print("开始同步登录")
login_name = self.txtLoginName.GetValue()
login_pwd = self.txtLoginPwd.GetValue()
if login_name == "":
MessageUtil.show_tips(self, "请输入用户名!")
return json_data = {
"loginname": f"{login_name}",
"password": f"{login_pwd}",
"systemtype": "WareMis",
} message = "正在尝试登陆获取令牌,请等待..."
icon = get_bitmap("appIcon", 16)
busy = PBI.PyBusyInfo(message, parent=self, title="登陆处理中...", icon=icon)
try:
wx.Yield() # 刷新界面 result = api_login.authenticate2(json_data)
if result.success:
# print("登录成功", result)
self._accesstoken = result.accesstoken
ApiClient.set_access_token(result.accesstoken)
self.is_login = True
self.Close()
else:
MessageUtil.show_tips(self, "用户名或密码错误!")
except Exception as e:
# print(e)
MessageUtil.show_tips(
self, "登录失败!错误信息如下:", extended_message=str(e)
)
finally:
# 关闭提示框
del busy

运行登录后,界面提示获取令牌的信息

成功后跳转到主界面窗体上。

以上就是实际使用wxpython开发跨平台桌面应用的登录界面,对接了后端FastAPI的WebAPI项目,该项目使用 FastAPI, SQLAlchemy, Pydantic, Pydantic-settings, Redis, JWT 构建的项目,数据库访问采用异步方式。 数据库操作和控制器操作,采用基类继承的方式减少重复代码,提高代码复用性。 支持Mysql、Mssql、Postgresql、Sqlite等多种数据库接入,通过配置可以指定数据库连接方式。。

使用wxpython开发跨平台桌面应用,设计系统的登录界面的更多相关文章

  1. Electron+Vue开发跨平台桌面应用

    Electron+Vue开发跨平台桌面应用 xiangzhihong发布于 2019-12-23 虽然B/S是目前开发的主流,但是C/S仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某 ...

  2. Win7系统取消登录界面的两种方法(图文)

    windows7系统设置电脑密码后,即使取消密码,也会出现登录界面 ,每次都要点击用户图标才能进入系统,这样比较麻烦.那么有什么办法可以取消登录界面呢?方法当然是有的,阅读下文教程,我们一起来看下Wi ...

  3. 使用XUL开发跨平台桌面应用

    先上图: 现在使用html,css,js开发桌面的优势越来越明显了,硬件性能的不断提升,人力成本越发昂贵,用户对界面要求越来越高,全球化下企业间的竞争越发激烈. 桌面软件50%+的工作量都在界面开发这 ...

  4. Electron开发跨平台桌面程序入门教程

    最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快.我会在这一篇文章中实现一个HelloWord ...

  5. 1、IOS开发--iPad之仿制QQ空间(登录界面搭建+登录逻辑实现)

    开始搭建登录界面 登录界面效果图: 相关的图片资源下载百度云备份链接: http://pan.baidu.com/s/1o71cvMU 密码: 2h7e 步骤开始: 设置辅助窗口的位置在下方 快捷键o ...

  6. 设计系统(Design System),设计和开发之间的“DevOps”

    最近,我们网站的上新增了几个新功能,比如通过导航栏的QR Code可以下载App:通过Carousel的方式,显示多条信息. 以往这样的功能可能需要2-3个Sprints完成,但是现在这些功能都是在一 ...

  7. 快速了解Electron:新一代基于Web的跨平台桌面技术

    本文引用了作者“ ConardLi”的<用JS开发跨平台桌面应用,从原理到实践>一文部分内容,原文链接:segmentfault.com/a/1190000019426512,感谢原作者的 ...

  8. nodegui 使用react开发跨平台应用试用

    nodegui官方团队提供了基于react 应用开发方式,同时我们集成官方的packer 进行快速的应用打包 项目说明 项目使用了官方的计算机应用,我使用官方的react starter,同时添加了p ...

  9. 基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)

    摘要:农作物叶片病害检测系统用于智能检测常见农作物叶片病害情况,自动化标注.记录和保存病害位置和类型,辅助作物病害防治以增加产值.本文详细介绍基于YOLOv5深度学习模型的农作物叶片病害检测系统,在介 ...

  10. ubuntu12.04管理员账户登录不了桌面,只能客人会话登录

    ubuntu12.04管理员账户登录不了桌面,只能客人会话登录 求助!!ubuntu12.04管理员账户登录不了桌面,只能客人会话登录. 登录管理员账户时,输入密码后,一直在登录界面循环 费了好大劲啊 ...

随机推荐

  1. 在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型

    NextChat介绍 One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4 & Gem ...

  2. vue3+ts Axios封装与使用

    创建完vue3 项目后 新版本:动态控制是否显示加载动画.是否需要判断重复请求.https://www.cnblogs.com/lovejielive/p/17676856.html 一,安装Axio ...

  3. VUE-局部使用

    目录 VUE-局部使用 快速入门 常用指令 v-for v-bind v-if & v-show v-on v-model vue生命周期 Axios Vue案例 VUE-局部使用 Vue 是 ...

  4. [学习笔记] 2-SAT

    引入 有 \(n\) 个变量 \(x_1 \cdots x_n\),每个变量的取值范围为 \(\{0,1\}\),另有 \(m\) 个条件,每个条件都是对其中两个变量的取值限制,形如要么 \(x_i ...

  5. Fluent Builder 模式

    前言 以前最讨厌设计复杂方法调用, 就是那种需要一堆有逻辑规则的 config 作为参数的方法. 这种 config 通常是一个大对象, 有许多 property, property 之间有存在一些逻 ...

  6. SQL Server 冗余维护

    介绍 冗余是维护的魔鬼, 是性能优化的天使 常见的冗余有 1. computed column 2. principal 的识别字段 3. cross computed 4. cascade soft ...

  7. Nodejs+npm详细安装

    Nodejs详细安装步骤1.去官网下载nodejs,下载地址:https://nodejs.org/en/download/ 根据自己要求下载,我这里下载的是windows installer的. 2 ...

  8. 三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!

    大家好,我是V哥,程序员聊天真是三句不到离不开技术啊,这不前两天跟一个哥们吃饭,他是我好多年前的学员了,一直保持着联系,现在都李总了,在做工业互联网相关的项目,真是只要 Java 学得好,能干一辈子, ...

  9. USB协议详解第8讲(USB描述符-字符串和语言ID描述符)

    1.字符串描述符相关概念 字符串描述符:首先,字符串描述符就是用字符串描述一个设备的一些属性,毕竟人能看懂的是字符,而不是十六进制,描述的属性包括设备厂商名字.产品名字.产品序列号.各个配置名字.各个 ...

  10. SCHED_RR和SCHED_FIFO的区别

    SCHED_RR和SCHED_FIFO是Linux内核中用来调度进程的两种调度策略,它们有以下几点区别: 调度方式:SCHED_RR采用轮转调度方式,而SCHED_FIFO则采用先进先出调度方式. 优 ...