使用wxpython开发跨平台桌面应用,设计系统的登录界面 ...

打印 上一主题 下一主题

主题 868|帖子 868|积分 2604

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

如前面所讲,我们在登录界面上放置一个图片占位全部,并在符合的位置上添加用户的登录账号和密码输入即可,剩下的就是对登录的请求和响应处理了。
我们基于WxPython来处理,放置图片一般就是用 wx.StaticBitmap,图片我们可以预先把他转换为嵌入的图片对象即可,如我们可以通过 img2py 下令来进行添加,把图片文件天生嵌入图片的对象。
如下令:
  1. 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 来处理即可。
登录界面的窗体如下所示。
  1. import testimage as testimage
  2. import wx
  3. class LoginFrame(wx.Frame):
  4.     def __init__(self, parent, title):
  5.         super(LoginFrame, self).__init__(parent, title=title, size=(600, 375),
  6.             style=wx.FRAME_NO_TASKBAR)
  7.         self.InitUI()
  8.     def InitUI(self):
  9.         panel = wx.Panel(self)
  10.         <strong>wx.StaticBitmap(panel, </strong><strong>-1, testimage.login_backimg.Bitmap,
  11.             pos= (0, 0), size=(-1, -1), style=</strong><strong>wx.BORDER_NONE)</strong>
  12.         font = wx.Font(16, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)
  13.         
  14.         self.userInput = wx.TextCtrl(panel, -1, value="admin", style=wx.TE_PROCESS_ENTER|wx.TE_CENTER|wx.CENTER, pos=(80, 330), size=(120, 28))
  15.         self.userInput.SetHint("输入账号")
  16.         self.userInput.SetFont(font)
  17.         self.passwordInput = wx.TextCtrl(panel, -1, pos =(280, 330), size=(120, 28), style=wx.TE_PASSWORD| wx.TE_PROCESS_ENTER|wx.TE_CENTER)
  18.         self.passwordInput.SetHint("输入密码")
  19.         self.passwordInput.SetFont(font)
  20.         loginButton =wx.BitmapButton(panel, -1, testimage.login_btn.Bitmap, pos= (410, 328),size= (92, 30))
  21.         self.Bind(wx.EVT_BUTTON, self.OnLogin, loginButton)
  22.         quitButton = wx.BitmapButton(panel, -1, testimage.quit.Bitmap, pos= (560, 10),size= (32, 30))
  23.         self.Bind(wx.EVT_BUTTON, self.OnQuit, quitButton)
  24.         self.Centre()
复制代码
上面代码,在MacOS上运行界面,还算不错,不过在WIndows上,输入框和标签都无法正常显示,必要主动鼠标单击的时间,才出现,输入核心也不太正常,后来搜刮解决方案才发现是系统界面革新的题目,不能使用 wx.StaticBitmap ,而必要使用革新绘制配景图片的方式才可以正常,因此改动一下,使用 EVT_ERASE_BACKGROUND 事件处理的方式绘制配景方式。
在 wxPython 中,EVT_ERASE_BACKGROUND 是一个事件,用于在控件或窗口的配景被擦除(重绘)时触发。通常,这个事件发生在窗口必要重新绘制其配景,例如窗口大小调整或显式调用 Refresh 方法时。
使用场景


  • 自定义控件的配景绘制。
  • 优化绘图性能,避免多余的配景擦除操作(例如在自定义绘图场景中)。
  • 实现特殊的配景效果(如渐变填充或图像配景)。
如果目的是简单地显示静态图像或快速实现 UI,StaticBitmap 是更便捷的选择。而如果必要复杂的配景效果或图像融合,则 EVT_ERASE_BACKGROUND 提供了更大的灵活性。
在初始化界面的时间,绑定该 EVT_ERASE_BACKGROUND 事件,如下代码所示。
  1. self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
复制代码
  1.     def OnEraseBack(self, event: wx.EraseEvent):
  2.         dc = event.GetDC()
  3.         if not dc:
  4.             dc = wx.ClientDC(self)
  5.             rect = self.GetUpdateRegion().GetBox()
  6.             dc.SetClippingRect(rect)
  7.         dc.Clear()
  8.         dc.DrawBitmap(<strong>testimage.login_backimg.Bitmap</strong>, 0, 0)
复制代码
如许测试MacOS和WIndows均正常显示。
 
2、登录界面的优化及对接登录处理

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

详细就是在绘制配景获得ClientDC 对象后绘制文本即可,如下代码所示。
  1.     def OnEraseBack(self, event: wx.EraseEvent):
  2.         dc = event.GetDC()
  3.         if not dc:
  4.             dc = wx.ClientDC(self)
  5.             rect = self.GetUpdateRegion().GetBox()
  6.             dc.SetClippingRect(rect)
  7.         dc.Clear()
  8.         dc.DrawBitmap(images.login_backimg.Bitmap, 0, 0)
  9.         colour = wx.Colour(52, 94, 150)
  10.         dc.SetTextForeground(colour)
  11.         dc.SetFont(
  12.             wx.Font(16, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)
  13.         )
  14.         rect = wx.Rect(10, 210, 580, 30)
  15. <strong>        dc.DrawLabel(
  16.             </strong><strong>"基于 wxPython 开发的 GUI 应用", rect, wx.ALIGN_CENTER | wx.ALIGN_TOP
  17.         )
  18.         rect = wx.Rect(10, 240, 580, 30)
  19.         dc.DrawLabel(
  20.             "COPYRIGHT © 2024 广州爱奇迪软件科技有限公司",
  21.             rect,
  22.             wx.ALIGN_CENTER | wx.ALIGN_TOP,
  23.         )</strong>
复制代码
为了对接实际的Python开发的FastApi后端,我们对增长一个login.py的API对接类,如下代码所示。
  1. from .base_api import BaseApi
  2. from entity.common import AjaxResponse, AuthenticateResult
  3. import requests
  4. class Login(BaseApi):
  5.     """登录处理--API接口类"""
  6.     api_name = "login"
  7.     def __init__(self):
  8.         super().__init__(self.api_name)
  9.     def authenticate2(self, json) -> AuthenticateResult:
  10.         """同步登录接口
  11.         :param json: 登录参数
  12.             {
  13.             "loginname": "string",
  14.             "password": "string",
  15.             "systemtype": "string",
  16.             }
  17.         :return: 登录结果
  18.         """
  19.         url = f"{self.base_url}/authenticate"
  20.         data = requests.post(url, json=json).json()
  21.         result = AjaxResponse[AuthenticateResult].model_validate(data)
  22.         return result.result
复制代码
增长登录过程的提示处理,代码如下所示。
  1.     def on_login(self, event):
  2.         self.LoginSync()
  3.     def LoginSync(self):
  4.         # print("开始同步登录")
  5.         login_name = self.txtLoginName.GetValue()
  6.         login_pwd = self.txtLoginPwd.GetValue()
  7.         if login_name == "":
  8.             MessageUtil.show_tips(self, "请输入用户名!")
  9.             return
  10.         json_data = {
  11.             "loginname": f"{login_name}",
  12.             "password": f"{login_pwd}",
  13.             "systemtype": "WareMis",
  14.         }
  15.         message = "正在尝试登陆获取令牌,请等待..."
  16.         icon = get_bitmap("appIcon", 16)
  17.         busy = PBI.PyBusyInfo(message, parent=self, title="登陆处理中...", icon=icon)
  18.         try:
  19.             wx.Yield()  # 刷新界面
  20.             result = api_login.authenticate2(json_data)
  21.             if result.success:
  22.                 # print("登录成功", result)
  23.                 self._accesstoken = result.accesstoken
  24.                 ApiClient.set_access_token(result.accesstoken)
  25.                 self.is_login = True
  26.                 self.Close()
  27.             else:
  28.                 MessageUtil.show_tips(self, "用户名或密码错误!")
  29.         except Exception as e:
  30.             # print(e)
  31.             MessageUtil.show_tips(
  32.                 self, "登录失败!错误信息如下:", extended_message=str(e)
  33.             )
  34.         finally:
  35.             # 关闭提示框
  36.             del busy
复制代码
运行登录后,界面提示获取令牌的信息

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

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

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表