昨日,将许久以前做的模拟网页登录脚本用PyQt封装了一下,结果出大问题了, 登录无数次都提示登录失败!!而不用PyQt实现的GUI登录直接脚本登录无数次都提示登录成功!!心中甚是伤痛,于是探究起来,解决这一问题。

问题描述及证据如下:

上图是脚本MD5加密过程及结果

上图是PyQt GUI中获取密码框内容后加密的结果,其实现代码如下:

# -*- coding: gbk -*-
'''
Version : Python27
Author : Spring God
Date : 2013-6-28
''' from PyQt4 import QtCore, QtGui, Qt
from UI import Ui_MainWindow
import md5 class MainWindow(QtGui.QMainWindow, Ui_MainWindow): def __init__(self, parent = None): # 初始化
super(MainWindow, self).__init__(parent)
self.setupUi(self) def login(self): password = self.lineEdit_Password.text()
print(md5.md5(password).hexdigest()) if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
app.exec_()

两者完全不同,这是怎么回事儿,开始探寻之旅:

一开始在输出加密密码之前先输出了传入加密的字符串,都是123456,无果。

然后想到是不是文件或者字符编码的问题,于是在输出加密密码之前先输出了传入加密的数据类型,果然找到了:在Python中是str,而在PyQt中却是PyQt4.QtCore.QString,这是个神马东西,看起来像是PyQt自己搞的数据类型。

于是上网搜索一下:
    关键词:PyQt QString str

    找到了Python String和PyQt QString的区别(转)这篇文章,看了一下,大致是说这两种类型字符串在有些场合需要互相转换,而且对中文的支持不是很好。我想骂人了,这PyQt主管界面开发就是了嘛,干嘛要自己弄个数据类型,简直是让这些Python爱好者头痛。

关键词:Qt md5 加密

找到了一些解决方案:

http://stackoverflow.com/questions/5495281/generating-a-md5-hash-with-qt

QString encodedPass =QString(QCryptographicHash::hash(("myPassword"),QCryptographicHash::Md5));
QString blah =QString(QCryptographicHash::hash(("myPassword"),QCryptographicHash::Md5).toHex());

http://blog.csdn.net/ei__nino/article/details/7306819

QString usernamemd5;
QString pwdmd5;
QByteArray bb;
bb = QCryptographicHash::hash ( password.toAscii(), QCryptographicHash::Md5 );
pwdmd5.append(bb.toHex());
bb = QCryptographicHash::hash(username.toAscii(),QCryptographicHash::Md5);
usernamemd5.append(bb.toHex());

总归就是使用PyQt的md5加密模块是吧。但是如果遇到这样的问题就妥协,那就存在不断大量改动代码的情况了,而且不利于GUI移植。

突然看到上面代码中的password.toAscii(),这该是一个转换的函数,查了一下文档,还有一个toUtf8的函数等等,这下有救了。将QString转换成str试试吧。

# -*- coding: gbk -*-
'''
Version : Python27
Author : Spring God
Date : 2013-6-28
''' from PyQt4 import QtCore, QtGui, Qt
from UI import Ui_MainWindow
import md5 class MainWindow(QtGui.QMainWindow, Ui_MainWindow): def __init__(self, parent = None): # 初始化
super(MainWindow, self).__init__(parent)
self.setupUi(self) def login(self): password = self.lineEdit_Password.text()
print(md5.md5(password.toUtf8()).hexdigest()) if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
app.exec_()

果然,将图中蓝底白字的代码加上就正确了。特此记事,以待备用。

 

PyQt QString 与 Python str&unicode的更多相关文章

  1. PyQt的QString和python的string的区别

    转载于http://blog.chinaunix.net/uid-200142-id-4018863.html python的string和PyQt的QString的区别 python string和 ...

  2. Python语言总结 4.2. 和字符串(str,unicode等)处理有关的函数

    4.2.7. 去除控制字符:removeCtlChr Python语言总结4.2. 和字符串(str,unicode等)处理有关的函数Sidebar     Prev | Up | Next4.2.7 ...

  3. python中unicode和str的组合

    python中unicode对象和str对象拼接在一起,会自动将str对象转换成unicode对象 即:a="aa" b=u"bb" c=a+b type(c) ...

  4. python decode unicode encode

    字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(en ...

  5. python中unicode, hex, bin之间的转换

    python中unicode, hex, bin之间的转换 背景 在smb中有个feature change notify, 需要改动文件权限dacl,然后确认是否有收到notify.一直得不到这个d ...

  6. Python str 与 bytes 类型(Python2/3 对 str 的处理)

    本文均在 Python 3 下测试通过,python 2.x 会略有不同. 1. str/bytes >> s = '123' >> type(s) str >> ...

  7. Python中Unicode字符串

    Python中Unicode字符串 字符串还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte ...

  8. #python str.format 方法被用于字符串的格式化输出。

    #python str.format 方法被用于字符串的格式化输出. #''.format() print('{0}+{1}={2}'.format(1,2,3)) #1+2=3 可见字符串中大括号内 ...

  9. Python str() 函数

    Python str() 函数  Python 内置函数 描述 str() 函数将对象转化为适于人阅读的形式. 语法 以下是 str() 方法的语法: class str(object='') 参数 ...

随机推荐

  1. Python string interning原理

    原文链接:The internals of Python string interning 由于本人能力有限,如有翻译出错的,望指明. 这篇文章是讲Python string interning是如何 ...

  2. Apple Notification Center Service--ANCS【转】

    Apple Notification Center Service 转自:http://studentdeng.github.io/blog/2014/03/22/ancs/ MAR 22ND, 20 ...

  3. JS判断是否是PC端访问网站

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", " ...

  4. 用Max导出Unity3D使用的FBX文件流程注解(转载)

    http://www.cnblogs.com/wantnon/p/4564522.html 从max导出FBX到Unity,以下环节需要特别注意.1,单位设置   很多人在建模,动画的时候,默认的ma ...

  5. java基础57 css样式、选择器和css定位(网页知识)

    本文知识点(目录): 1.CSS样式    2.选择器    3.CSS定位 1.CSS样式 1.html 在一个网页中负责的是一个页面的结构    2.css(层叠样式表)在一个页面中负责了一个页面 ...

  6. ZooKeeper的基本概念(二)

    第一篇博文,我们对Zookeeper有了一个简单的认识,而且比较浅显,易懂,这篇博文,我们了解它的基本概念,如下图所示: 了解它的基本概念,有助于我们后面的学习,虽然今天的文章都是概念性质的内容,但是 ...

  7. Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件

    前言: 忙完了结婚乐APP的开发,终于可以花一定的时间放在博客上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下目标效果以及demo效果:      因为此效果实现的步骤 ...

  8. MFC+WinPcap编写一个嗅探器之五(过滤模块)

    这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤 设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图: 首先要根据用户的选择来生成一个合法的过滤规 ...

  9. 【LOJ】#2722. 「NOI2018」情报中心

    https://loj.ac/problem/2722 题解 考场上想了60分,但是由于自己不知道在怎么zz,我连那个ai<bi都没看到,误以为出题人没给lca不相同的部分分,然后觉得lca不同 ...

  10. python3与mysql交互:pymysql

    python3与mysql交互 1.安装pymysql模块 pip3 install pymysql3 2.pymysql的简单使用: # /usr/bin/env python3 import py ...