Python实战:wxPython结合PyMySQL实现用户登录界面
本文介绍如何利用wxPython库创建图形用户界面,并结合PyMySQL连接本地MySQL数据库实现用户登录功能。内容涵盖窗口图标设置、静态图片展示、按钮事件绑定及数据库查询逻辑,提供完整代码示例与布局注意事项。
wxPython与PyMySQL登录界面实现概述
wxPython作为Python生态中广受欢迎的GUI开发库,凭借简洁易用的特性及强大的功能支持,吸引了大量Python开发者。与此同时,PyMySQL作为Python 3环境下连接MySQL数据库的主流工具,应用十分广泛。本文将结合这两个库,演示如何构建一个基础的用户登录GUI窗口界面。
界面效果预览
首先,让我们预览一下最终实现的界面效果。



窗口搭建关键注意事项
在构建该窗口时,有几个关键点需要注意,以避免常见错误。
设置窗口图标
设置窗口左上角的图标: 建议将图片尺寸统一设计为32x32像素,以确保显示效果最佳。
#设置窗口的左上角的图标
#其中参数type表示图片的类型,还有ico,jpgm等类型
icon_1 = wx.Icon(name='python1.png',type=wx.BITMAP_TYPE_PNG)
frame.SetIcon(icon_1)
Panel中添加静态图片
在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)) # 固定的写法使用
具体效果如下所示。

数据库连接与用户验证逻辑
使用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='账号和密码不能为空')
布局局限性说明
总体而言,由于作者对布局管理器的掌握尚浅,此处采用了固定坐标定位方式,导致窗口拉伸时界面效果不够理想。

完整源代码示例
以下是案例的完整源代码。
只需将所需的图片资源与代码文件置于同一目录下,即可直接运行程序。
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或其他相关话题,并欢迎指出文中存在的问题。
以上就是本文的全部内容,希望对各位的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













