页面载入中...
首页 » Tag ‘PyQt’

PyQt程序编译后的数据库驱动问题

舍得按:这个问题困住舍得蛮长的一段时间了。在用cx-freeze对写完的程序进行编译的时候,舍得发现,程序居然无法正常打开数据库!直到今晚,按脑中突然冒出的一个念头试了一下,发现解决问题的方法竟然是如此滴简单。

先介绍一下问题的背景:在舍得写的这个程序中要用到Qt自带的MySQL驱动,在本地调试的时候,一切正常,数据可以随心所欲滴读取、写入。可一旦用cx-freeze对程序进行编译后,杯具发生,数据库就再也打不开了。

难道是cx-freeze出了错?

还是,根本没法酱紫调用数据库?那写好的程序只能带着Python的环境运行了?

舍得有一个优点是会去想各种各样的“可能”的解决办法,然后一一尝试。哪怕可能性很低很低,只要尝试的成本没有超出舍得的忍耐程度,那——还是会去试。

就这样一个个方案试过去,直到找到答案:

你要调用哪个数据库的驱动,先在程序目录下新建一个叫”sqldrivers“的文件夹,然后把那个驱动(通常放在"Python安装目录\Lib\site-packages\PyQt4\plugins\sqldrivers下,例如舍得要用到MySQL的驱动,就复制qsqlmysql4.dll")复制过来,放到这个文件夹下。然后就没有然后了,直接运行编译好的程序,你会发现数据库正常了。

 

本文版权归舍得学苑所有,欢迎转载,转载请注明作者和出处。谢谢!
作者:
舍得
首发:舍得@学习力博客

[编程心得]PyQt中让按钮保持按下状态

近日舍得在开发SuperMemo转换精灵体验版的时候遇到了一个问题,舍得需要左侧一个竖排的工具栏,工具栏中的按钮点下后高亮为蓝色,而且点击后一直保持这种高亮状态.直到另一个按钮按下,把它替换掉为止,就象下面这个效果:

SNAG-0043

在实际使用的时候发现了问题:当鼠标在主窗口的其它位置点击的时候,这个蓝色高亮状态就消失了,舍得尝试了很多种方法,什么信号槽啊,事件啊啥的,一直找不到一个妥善的解决方案,这几乎已经成为舍得心头的一根刺了。

直到今天,在度娘的帮助下,找到了一篇文章《Qt保持状态的Button》,直觉告诉我这个可以解决,马上动手测试,终于把这根刺给干掉了。

下面是解决的方案:

在按钮中应用下面的函数:

        self.scriptBtn.setCheckable(True)
        self.scriptBtn.setAutoExclusive(True)

像舍得上面这幅图中总共5个按钮,需要一一设置。

然后在QSS样式表中设置:

QPushButton::checked,QToolButton::checked{
    background: #3C79F2;
    border-color: #11505C;
    font-weight: bold;
    font-family:"Microsoft YaHei";
}

就完成了舍得预期的效果,每个按钮点中后高亮,直至另一个按钮被点击;鼠标即使在非按钮区点击,高亮效果仍然保留.

 

本文版权归舍得英语魔法学苑所有,欢迎转载,转载请注明作者和出处。谢谢!

作者:
舍得

首发:
舍得@学习力博客

[编程心得]PyQt中“明天”的表示法

话说学苑有童鞋抱怨,说一直在看舍得的博客,希望舍得能多介绍一些SuperMemo和Tell Me More方面的使用技巧。这个要求估计比较难满足。倒不是因为SuperMemo和Tell Me More方面已经没什么好写——这绝对不是事实,只要将SuperMemo官网上的文章翻译翻译,再适度延伸一下,一篇文章就出来了,但舍得不想为了交任务而写东西。博客嘛!写下自己最想写的内容才是最佳的选择。这不,现在写上了编程方面的内容。

Qt用的人不少,不过PyQt的就略微少一些。但没关系,舍得用惯了就好。在这里所写的一些东西,都是舍得在实际编程的过程中用到的。之前舍得在学苑里有讲到,舍得向来是走实战流,更准确地讲是“改装流”。因为舍得从来不去探究代码背后的种种原理,往往满足于“我知道这段代码干什么用的”、“这里放这样的代码应该能解决问题”。由于非科班出身,代码难免写得难看点,执行效率多少会低一些,好在舍得的满足点比较低,只要“能用”就行了,这一点倒与不求上进的腾讯有些相似。

下面介绍的是在PyQt中“明天”的表示法,这是最近写的一个HR程序中用到的,先来看看今天怎么表示,比如说我们有一个DateEdit控件,叫做beginDayDateEdit,要给它赋上“今天”这个值就可以这样写:

beginDayDateEdit.setDate(QtCore.QDate.currentDate())

那明天呢?咋办办?

舍得看了看PyQt官方的说明文档,从中找到了一个方法,就是将currentDate先用toJulianDay转成数值形式,然后加1,再用fromJulianDay转回来就可以了,具体的代码如下:

tomorrow = QtCore.QDate.currentDate().toJulianDay() + 1
beginDayDateEdit.setDate(QtCore.QDate.fromJulianDay(tomorrow))

后天、大后天就可以依此类推,不再赘述。

不过在处理DateTimeEdit的控件会有所差异,此时用的不是toJulianDay和fromJulianDay,而是toTime_t和fromTime_t,我们来看看:

tomorrow = QtCore.QDateTime.currentDateTime().toTime_t() + 86400
self.beginDayDateEdit.setDateTime(QtCore.QDateTime.fromTime_t(tomorrow))

注意,由于控件改变了,setDate也变成了setDateTime,toTime_t把当前时间转成了从1970年1月1日00:00:00到现在的总秒数,要加1天的话,加上86400秒就行了。

 

 

本文版权归舍得英语魔法学苑所有,欢迎转载,转载请注明作者和出处。谢谢!
作者:
舍得
首发:
舍得@学习力博客

[编程心得]用python取汉字首字母

近日给兄弟公司编写一个HR管理软件,其中需要用到这样一个功能:当用户在窗口中输入员工姓名时,能够自动取出姓名中的拼音首字母,作为"助记码",以便用于后续的查询。

尝试了几种不同的方案以后,最终参考水木社区中的Roy兄提出的方案,用Python+Sqlite的方式来完成此项工作。

软件环境如下:

Python 3.2.2

PyQt 4.9.1

Sqlite 3

在文件头部需先导入sqlite3:

import sqlite3

 

然后来看getFirstLetter段代码:

   1:      def getFirstLetter(self, text):
   2:          pinyinlist=[]
   3:          for i in range(len(text)):
   4:              hanziSql = 'select pinyin from hanzi where hanzi = "'\
   5:                              + text[i] + '"'
   6:              pinyinlist.append([])
   7:              result = self.execSql(hanziSql)
   8:              for pinyin in result:                    
   9:                  pinyinlist[i].append(pinyin[0][0])#数据库中查到的是整个拼音,用pinyin[0][0]则指定返回首字母
  10:          poslist=[-1]*len(text)
  11:          i=0
  12:          results=[]
  13:          n=0
  14:          while (i>=0):
  15:              poslist[i]=poslist[i]+1
  16:              if (poslist[i]>=len(pinyinlist[i])) :
  17:                  poslist[i]=-1
  18:                  i=i-1
  19:                  continue
  20:              if i==len(text)-1:
  21:                  results.append('')
  22:                  for t in range(len(text)):
  23:                      results[n]=results[n]+pinyinlist[t][poslist[t]]
  24:                  n=n+1
  25:              else :
  26:                  i=i+1
  27:          return results 
 
里面调用到的execSql段代码如下:
   1:      def execSql(self, sql):
   2:          cxn = sqlite3.connect(db)
   3:          cur = cxn.cursor()
   4:          cur.execute(sql)#执行查询
   5:          return cur.fetchall()
   6:          cxn.close()
 
execSql这一段当然可以直接并到getFirstLetter中,不过舍得在其它地方要调用它,所以单独列出.
 
具体使用的方法如下,比如我们要查"舍得学苑"的拼音首字母:

        easyCode = self.getFirstLetter("舍得学苑")
        if len(easyCode) > 0:
            print(easyCode[0])#返回的结果中有多音词 ,只取第一个


 

本文用到的数据库可到这里下载:华为网盘下载
 

本文版权归舍得英语魔法学苑所有,欢迎转载,转载请注明作者和出处。谢谢!

作者:
舍得

首发:
舍得@学习力博客