wxpython+pymysql实现用户登陆功能


Posted in Python onNovember 19, 2019

wxpython最为一款python GUI库,由于简单和轻便外加强大的功能而受到很多python爱好者的喜爱,pymysql作为python3.x版本连接mysql库,应用也非常广泛。今天利用这两个库写一个简单的用户登陆的GUI窗口界面:

1.先看看界面的效果图:  

wxpython+pymysql实现用户登陆功能

wxpython+pymysql实现用户登陆功能

wxpython+pymysql实现用户登陆功能

2.在搭建窗口时容易出现问题的几点:

设置窗口图标:窗口左上角图片
最好将图片的尺寸设计为32x32的格式:

#设置窗口的左上角的图标
#其中参数type表示图片的类型,还有ico,jpgm等类型
icon_1 = wx.Icon(name='python1.png',type=wx.BITMAP_TYPE_PNG)
frame.SetIcon(icon_1)

在panel中添加图片展示:

panel = wx.Panel(frame,-1)
  # 向panel中添加图片
image =wx.Image("python2.jpg", wx.BITMAP_TYPE_JPEG).ConvertToBitmap()
wx.StaticBitmap(panel, -1, bitmap=image, pos=(0, 0))

给登陆按钮设计点击函数:
本次没有使用图片按钮,只是简单的按钮插件,所以看起来比较丑

#添加按钮,pos参数为其位置
  self.but_login = wx.Button(panel,-1,"登陆", size=(120,50), pos=(120,300))
  self.but_register = wx.Button(panel,-1,"注册", size=(120,50), pos=(260,300))
  #设置按钮的颜色
  self.but_login.SetBackgroundColour("#0a74f7")
  self.but_register.SetBackgroundColour("#282c34")
  #给按钮绑定事件
  self.Bind(wx.EVT_BUTTON,self.on_but_login,self.but_login)
  self.Bind(wx.EVT_BUTTON,self.on_but_register,self.but_register)

如果要设计图片按钮可以这样实现:

#设置图片按钮
pic = wx.Image('but_log.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap() # 把这个图片的内容妆转化为这个pic 变量。
#pos为位置参数,设置按钮放置的位置
self.button = wx.BitmapButton(panel, -1, pic, pos=(10, 10)) # 固定的写法使用

效果如下:

wxpython+pymysql实现用户登陆功能

pymysql连接本地数据库,与用户输入对比:

通过getValue()的方法获取用户的输入内容,然后连接数据库经行查找和比较;

#定义一个消息弹出框的函数
 def show_message(self,word=""):
  dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION)

  if dlg.ShowModal() == wx.ID_YES:
   #self.Close(True)
   pass
  dlg.Destroy()


 def on_but_login(self,event):
  #连接到本地数据库

  user_name = self.entry_user.GetValue()
  pass_word= self.entry_pass.GetValue()

  sql = """select pass from student where name ='%s' """ % (user_name)
  #判断,查看用户名和密码名是否为空
  #不为空之后在进行查询和判断
  #不然当密码或用户名为空时会出现会导致出错
  if user_name and pass_word:
   db = pymysql.connect(host="localhost", user="root",
   password="zhang123", db="user", port=3306)
   # 使用cursor()方法获取操作游标
   cur = db.cursor()
   try:

    cur.execute(sql) # 执行sql语句

    results = cur.fetchall() # 获取查询的所有记录
    #返回值是一个元组的形式
    #print(type(results))
    if results:
     #print(type(results[0][0]))
     #print(results[0][0])
     if results[0][0] == pass_word:
      #表示登陆成功,后续可以写登陆成功后的界面
      #此处就不再写
      pass
      #print("sucessful")

     else:
      self.show_message(word="密码错误")


    else:
     self.show_message(word='用户名不存在')

   except Exception as e:
    db.rollback()


   finally:

    db.close() # 关闭连接
  else:
   self.show_message(word='账号和密码不能为空')

总之,由于本人对布局掌握的不是很好,用的时固定坐标的方法,导致当窗口进行拉升的时候效果不是很好:

wxpython+pymysql实现用户登陆功能

案例的整体源代码:

大家只要将需要加载的图片资源和代码放在同一个文件下就可以运行了:

import wx
import pymysql
#由于当前对布局管理器不是很熟悉,所系使用的是固定位置,导致窗口拉伸的效果不是很好
class MyApp(wx.App):
 def __init__(self):
  wx.App.__init__(self)
  frame = wx.Frame(parent=None,title='Login',size=(532,420))
  #设置窗口的左上角的图标
  #其中参数type表示图片的类型,还有ico,jpgm等类型
  icon_1 = wx.Icon(name='python1.png',type=wx.BITMAP_TYPE_PNG)
  frame.SetIcon(icon_1)

  panel = wx.Panel(frame,-1)
  # 向panel中添加图片
  image =wx.Image("python2.jpg", wx.BITMAP_TYPE_JPEG).ConvertToBitmap()
  wx.StaticBitmap(panel, -1, bitmap=image, pos=(0, 0))

  #添加静态标签
  label_user = wx.StaticText(panel,-1,"账号:", pos=(80,200))
  label_pass = wx.StaticText(panel,-1,"密码:", pos=(80,240))
  #添加文本输入框
  self.entry_user = wx.TextCtrl(panel,-1,size=(200,30), pos=(130,200))
  #style 为设置输入
  self.entry_pass = wx.TextCtrl(panel,-1, size=(200,30), pos=(130,240), style=wx.TE_PASSWORD)
  #添加按钮
  self.but_login = wx.Button(panel,-1,"登陆", size=(120,50), pos=(120,300))
  self.but_register = wx.Button(panel,-1,"注册", size=(120,50), pos=(260,300))
  #设置按钮的颜色
  self.but_login.SetBackgroundColour("#0a74f7")
  self.but_register.SetBackgroundColour("#282c34")
  #给按钮绑定事件
  self.Bind(wx.EVT_BUTTON,self.on_but_login,self.but_login)
  self.Bind(wx.EVT_BUTTON,self.on_but_register,self.but_register)
  #
  frame.Center()
  frame.Show(True)

 #定义一个消息弹出框的函数
 def show_message(self,word=""):
  dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION)

  if dlg.ShowModal() == wx.ID_YES:
   #self.Close(True)
   pass
  dlg.Destroy()


 def on_but_login(self,event):
  #连接到本地数据库

  user_name = self.entry_user.GetValue()
  pass_word= self.entry_pass.GetValue()

  sql = """select pass from student where name ='%s' """ % (user_name)
  #判断,查看用户名和密码名是否为空
  #不为空之后在进行查询和判断
  #不然当密码或用户名为空时会出现会导致出错
  if user_name and pass_word:
   db = pymysql.connect(host="localhost", user="root",
   password="zhang123", db="user", port=3306)
   # 使用cursor()方法获取操作游标
   cur = db.cursor()
   try:

    cur.execute(sql) # 执行sql语句

    results = cur.fetchall() # 获取查询的所有记录
    #返回值是一个元组的形式
    #print(type(results))
    if results:
     #print(type(results[0][0]))
     #print(results[0][0])
     if results[0][0] == pass_word:
      #表示登陆成功,后续可以写登陆成功后的界面
      #此处就不再写
      pass
      #print("sucessful")

     else:
      self.show_message(word="密码错误")


    else:
     self.show_message(word='用户名不存在')

   except Exception as e:
    db.rollback()


   finally:

    db.close() # 关闭连接
  else:
   self.show_message(word='账号和密码不能为空')




 def on_but_register(self,event):
  #类似上上面的查询,只需获取相关内容插入到数据库就可以做出相关的操作
  #内容与上面内容相似,不再经行书写
  pass


if __name__=='__main__':
 app = MyApp()
 app.MainLoop()

总结:

这是我的第一篇博客,写的不好请大家见谅,也欢迎大家和我一起来探讨python或其他的话题,也欢迎大家给我指出问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 初始化多维数组代码
Sep 06 Python
Python入门篇之数字
Oct 20 Python
在Python的Flask框架中验证注册用户的Email的方法
Sep 02 Python
Python控制多进程与多线程并发数总结
Oct 26 Python
Python编程实现的图片识别功能示例
Aug 03 Python
python判断数字是否是超级素数幂
Sep 27 Python
Python实现常见的回文字符串算法
Nov 14 Python
python地震数据可视化详解
Jun 18 Python
python 图像处理画一个正弦函数代码实例
Sep 10 Python
python中提高pip install速度
Feb 14 Python
python实现快递价格查询系统
Mar 03 Python
python修改微信和支付宝步数的示例代码
Oct 12 Python
pygame编写音乐播放器的实现代码示例
Nov 19 #Python
pyinstaller打包程序exe踩过的坑
Nov 19 #Python
基于Python中的yield表达式介绍
Nov 19 #Python
Python函数式编程指南:对生成器全面讲解
Nov 19 #Python
wxPython电子表格功能wx.grid实例教程
Nov 19 #Python
python 实现return返回多个值
Nov 19 #Python
wxPython实现带颜色的进度条
Nov 19 #Python
You might like
PHP简介
2006/10/09 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
浅析PHP开发规范
2018/02/05 PHP
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
python self,cls,decorator的理解
2009/07/13 Python
Python文件夹与文件的相关操作(推荐)
2016/07/25 Python
python获取中文字符串长度的方法
2018/11/14 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
一文读懂Python 枚举
2020/08/25 Python
python判断字符串以什么结尾的实例方法
2020/09/18 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
售后服务承诺书范文
2014/03/26 职场文书
安全宣传标语
2014/06/10 职场文书
未婚证明格式
2015/06/15 职场文书
班主任寄语2016
2015/12/04 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android
delete in子查询不走索引问题分析
2022/07/07 MySQL