一般的系统登统界面,设计好看一些,系统会增色不少,而常规的桌面程序,包括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. mysql外键设置失败踩坑记录

    把表里面的数据清空再添加 原因 因为外键一定要对应外面那个表的数据,现在添加外键会导致这个外键的值为空,违反了键的非空约定 理解为已有的数据突然多出来个字段,但是不知道值是什么,那就为空了 主键和外键 ...

  2. pyinstaller 打包 win32ctypes.pywin32.pywintypes.error: (225, '', '无法成功完成操作,因为文件包含病毒或潜在的垃圾软件。')

    背景: 使用python 写了一个程序,使用pyinstaller打包, 不使用-w --noconsole的命令打包隐藏命令行窗口时,是正常的, 但是使用-w或者--noconsole就会报错win ...

  3. 牛逼!Vue3.5的useTemplateRef让ref操作DOM更加丝滑

    前言 vue3中想要访问DOM和子组件可以使用ref进行模版引用,但是这个ref有一些让人迷惑的地方.比如定义的ref变量到底是一个响应式数据还是DOM元素?还有template中ref属性的值明明是 ...

  4. 如何排查线上w3wp.exe CPU高的问题,使用到了WinDbg、Visual studio来分析IIS进程池的.dmp文件

    最近发现服务器上某个web站点老是CPU很高,该站点部署在IIS上,我IIS上有多个站点,每个站点一个进程池,每个进程池取名都是根据站点来取的,所以很容易看出哪个站点吃掉的CPU,该站点已运行十几年, ...

  5. 鸿蒙(HarmonyOS)常见的三种弹窗方式

    最近有一个想法,做一个针对鸿蒙官方API的工具箱项目,介绍常用的控件,以及在项目中如何使用,今天介绍Harmony中如何实现弹窗功能. 警告弹窗 警告弹窗是一个App中非常常用的弹窗,例如: 删除一条 ...

  6. 安全 – CSP (Content Security Policy)

    前言 之前讲过 CSRF.防 Cookie hacking 的. 也介绍过防 XSS 的 HtmlSanitizer. 今天再介绍 CSP. 参考 Content Security Policy 介绍 ...

  7. Maven高级——属性

    属性 自定义属性 定义属性 <!-- 定义属性--> <properties> <spring.version>5.2.10.RELEASE</spring. ...

  8. Brainstorm 了道题但是不会做

    题 因为没想出来暂时没定数据范围,不过应该会在 \(n^{2}\) 到 \(n^{3}\) 级别 我的一个思路是先对合法的方案连并查集,然后并查集内判重,但是不会算方案数,因为假如找到重的了不能直接看 ...

  9. Kubernetes集群证书过期解决办法

    问题现象 K8S集群证书过期后,会导无法创建Pod,通过kubectl get nodes也无法获取信息,甚至dashboard也无法访问. 一.确认K8S证书过期时间 查看k8s某一证书过期时间: ...

  10. VB.NET 在 Windows下通过WIn32API获取CPU和内存的使用率

    .net 要获取CPU和内存的使用率,一般是通过 PerformanceCounter 或者 WMI 查询得到,但是如果操作系统经常不正常断电或者别的什么原因,让系统的性能计数器抽风了,可能就会造成初 ...