基于PyQt4和PySide实现输入对话框效果


Posted in Python onFebruary 27, 2019

今天做了个基于PyQt4和PySide的输入对话框.已放到PyPi中,包名wlab,大家可以使用pip安装:

pip install wlab

在程序输入中,有时会要求同时改变多个参数值,而且类型也不尽相同,
这时下面的模块比较彻底的解决了这个问题.先看个示例吧.

比如我们有三个参数,分别为int,float,和字符串类型:

values={'String':'This is String','float':3.5,'int':15}
GroupBoxTitle='Please set values:'
title='QInputBox:'
rvalues=QInputBox(values=values,GroupBoxTitle=GroupBoxTitle,title=title)
print(rvalues)

生成的GUI界面如下:

基于PyQt4和PySide实现输入对话框效果

返回的结果中我们注意到字典rvalues里面数据的类型和字典valuse中时一致的.

也就是说:

如果values中是整数,那么rvalue中的值也是整数;

如果value中是浮点数,那么rvalue中的值也是浮点数;

如果value中是字符串,那么rvalue中的值也是字符串;

目前只支持这三种类型.但对values中输入参数并没有没有数目限制.

对于不会使用pip的新手,可以复制下面的文件:

#-*- coding:utf-8 -*-
#~ #--------------------------------------------------------------------------------
#~ module:wlab
#~ FileName=WPyQtInput.py
#~Class:QInputGroupBox,QInputDialog,QInputBox
#~ author:Wu Xuping
#~ Date:2013-05-06
#~ Email:539688300@qq.com
#~ Remark:based on PyQt4 or PySide
#~ #-------------------------------------------------
 
try:
  from PyQt4 import QtGui
  from PyQt4 import QtCore
  from PyQt4.QtCore import pyqtSlot
  from PyQt4.QtCore import pyqtSignal
  IsPyQt=True
  IsPySide=False
except ImportError:
  from PySide import QtGui
  from PySide import QtCore
  from PySide.QtCore import Slot as pyqtSlot
  from PySide.QtCore import Signal as pyqtSignal
  IsPyQt=False
  IsPySide=True
#~ #-------------------------------------------------
 
#~ #-------------------------------------------------
#~ #将字符串一特定的长度输出
def FormatStr(MaxStrLength,s):
  if (len(s)<MaxStrLength):
    for n in range(MaxStrLength-len(s)):
      s=' '+s
 
  rs=str(s)+':'
  return rs
 
class IntLineEdit(QtGui.QLineEdit):
  def __init__ (self,num=0):
    '''
    #~ IntLineEdit(num)
    '''
    QtGui.QLineEdit.__init__ (self)
    self.num=num
    self.setText(str(self.num))
 
  @pyqtSlot(int)
  def setValue(self,n):
    self.setText(str(n))
    return (self.num,n)
 
class FloatLineEdit(QtGui.QLineEdit):
  def __init__ (self,num=0.0):
    '''
    #~ FloatLineEdit(num)
    '''
    QtGui.QLineEdit.__init__ (self)
    self.num=num
    self.setText(str(self.num))
 
  @pyqtSlot(int)
  def setValue(self,n):
    if ( self.num>0):
      self.setText(str(self.num+n*self.num/50.0))
    else:
      self.setText(str(self.num-n*self.num/50.0))
    return (self.num,n)
#~ #-------------------------------------------------
class QInputGroupBox(QtGui.QGroupBox):
  def __init__(self, values={'String':'This is String','float':3.5,'int':15},title='Please set values',ntimes=2.0,parent=None):
    '''
    #~#---------------------------------------------------
    #~#Examples:
    #~#---------------------------------------------------
    #~ >>>values={'String':'This is String','float':3.5,'int':15}
    #~ >>>GroupBoxTitle='Please set values'
    #~ >>>self.QIGBox=QInputGroupBox(values=values,title=GroupBoxTitle,ntimes=2.0,parent=self)
    #~ >>>rvalues=self.QIGBox.GetOriginValue()
    #~ >>>rvalues=self.QIGBox.GetModifiedValues()
    #~#---------------------------------------------------
    #~#Parameters:
    #~#---------------------------------------------------
    #~#values={'String':'This is String','float':3.5,'int':15}
    #~#title='Please set values'
    #~#ntimes=2.0
    #~#parent=None
    '''
    QtGui.QGroupBox.__init__ (self, title=title,parent = parent)
 
    self.OriginValues=values.copy()
    self.ModifiedValues=values.copy()
 
    MaxStrLength=max([len(str(s)) for s in list(values.keys())])
 
    layout = QtGui.QGridLayout()
    cnt=0
    for key in self.ModifiedValues:
      label=FormatStr(MaxStrLength,str(key))
      KeyLabel=QtGui.QLabel(label)
      layout.addWidget(KeyLabel, cnt, 0)
      ovk=self.ModifiedValues[key]
 
      if(type(ovk)==int) :
        valueLineEdit=IntLineEdit(ovk)
        layout.addWidget(valueLineEdit, cnt , 1)
        slider=QtGui.QSlider(orientation= QtCore.Qt.Horizontal)
        if (ovk>0):
          slider.setRange( ovk/(ntimes+1), ovk*(ntimes+1))
        elif (ovk==0):
          slider.setRange( -5*(ntimes+1), 5*(ntimes+1))
        else:
          slider.setRange(ovk*(ntimes+1),ovk/(ntimes+1))
        slider.setValue(ovk)
        QtCore.QObject.connect(slider,QtCore.SIGNAL('valueChanged(int)'),
              valueLineEdit, QtCore.SLOT('setValue(int)'))
        layout.addWidget(slider, cnt ,2)
 
      elif(type(ovk)==float) :
        valueLineEdit=FloatLineEdit(ovk)
 
        layout.addWidget(valueLineEdit, cnt , 1)
        slider=QtGui.QSlider(orientation= QtCore.Qt.Horizontal)
        slider.setRange( -50*ntimes, 50*ntimes)
        QtCore.QObject.connect(slider,QtCore.SIGNAL('valueChanged(int)'),
              valueLineEdit, QtCore.SLOT('setValue(int)'))
        layout.addWidget(slider, cnt ,2)
 
      else:
        valueLineEdit=QtGui.QLineEdit(ovk)
        layout.addWidget(valueLineEdit, cnt, 1,1,2)
 
      #~ #set an object name for QLineEdit,Later we can use findchild() to find it
      valueLineEdit.setObjectName('VLE'+str(cnt))
 
      layout.setRowStretch(cnt,5)
      cnt=cnt+1
 
    layout.setColumnStretch(0, 1)
    layout.setColumnStretch(1, 5)
    layout.setColumnStretch(2, 10)
 
    self.setLayout(layout)
 
 
  def GetOriginValue(self):
    '''
    #~ if the user click btn_Cancel,then return OriginValues
    '''
    return self.OriginValues
 
  def GetModifiedValues(self):
    '''
    #~ if the user click btn_OK,then return self.ModifiedValues
    '''
    cnt=0
    for key in self.ModifiedValues:
      keyStr=str(key)
      VLEObjectName='VLE'+str(cnt)
      if (IsPyQt):
        VLE=self.findChild((QtGui.QLineEdit, ),VLEObjectName)
      else:
        VLE=self.findChild(QtGui.QLineEdit,VLEObjectName)
      cnt=cnt+1
      ovk=self.ModifiedValues[key]
      if(type(ovk)==int):
        self.ModifiedValues[key]=int(VLE.text())
      elif(type(ovk)==float):
        self.ModifiedValues[key]=float(VLE.text())
      else:
        self.ModifiedValues[key]=str(VLE.text())
 
    return self.ModifiedValues
#~ #-------------------------------------------------
class QInputDialog(QtGui.QDialog):
  def __init__(self, values={'String':'This is String','float':3.5,'int':15},GroupBoxTitle='Please set values',title='QInputDialog:',parent=None):
    '''
    #~ >>>values={'String':'This is String','float':3.5,'int':15}
    #~ >>>GroupBoxTitle='Please set values'
    #~ >>>title='QInputDialog:'
    #~ >>>dlg = QInputDialog(values=values,GroupBoxTitle=GroupBoxTitle,title=title,parent=None)
    #~ >>>if ( dlg.exec_() == QtGui.QDialog.Accepted):
     #~ >>>   rvalues = dlg.GetModifiedValues()
    #~ >>>else:
    #~ >>>   rvalues = dlg.GetOriginValue()
    '''
    QtGui.QDialog.__init__(self, parent=parent)
    self.setWindowTitle(title)
    self.QIGBox=QInputGroupBox(values=values,title=GroupBoxTitle,parent=self)
 
    self.vbox = QtGui.QVBoxLayout()
    self.vbox.addWidget(self.QIGBox)
 
    self.btn_OK=QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok)
    self.btn_Cancel=QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Cancel)
 
    self.btn_OK.clicked.connect(self.accept )
    self.btn_Cancel.clicked.connect(self.reject)
 
    hbox = QtGui.QHBoxLayout()
    hbox.addWidget(self.btn_OK)
    hbox.addWidget(self.btn_Cancel)
    self.vbox.addLayout(hbox)
    self.setLayout(self.vbox)
 
  def GetOriginValue(self):
    '''
    #~ if the user click btn_Cancel,then return OriginValues
    '''
    return self.QIGBox.GetOriginValue()
 
  def GetModifiedValues(self):
    '''
    #~ if the user click btn_OK,then return self.ModifiedValues
    '''
    return self.QIGBox.GetModifiedValues()
#~ #-------------------------------------------------
#~ #Good packaging QInputBox
def QInputBox(values={'String':'This is String','float':3.5,'int':15},GroupBoxTitle='Please set values',title='QInputBox'):
  '''
  #~ >>>values={'String':'This is String','float':3.5,'int':15}
  #~ >>>GroupBoxTitle='Please set values'
  #~ >>>title='QInputBox'
  #~ >>>rvalues=QInputBox(values=values,GroupBoxTitle=GroupBoxTitle,title=title)
  #~ >>>print(rvalues)
  #~ #>>>rvalues=QInputBox(values,GroupBoxTitle)
  #~ #>>>rvalues=QInputBox(values)
  #~ #>>>rvalues=QInputBox()
  '''
  #app = QtGui.QApplication(sys.argv)#已自动创建,无需再创建
  dlg = QInputDialog(values=values,GroupBoxTitle=GroupBoxTitle,title=title)
  if ( dlg.exec_() == QtGui.QDialog.Accepted):
    rvalues = dlg.GetModifiedValues()
  else:
    rvalues = dlg.GetOriginValue()
  return rvalues
 
#~ #---------------------------------------------------------------------------------------------------------
#~ # main test program for __WPyQtInput__.py
#~ #---------------------------------------------------------------------------------------------------------
if __name__ == '__main__':
  #----------------------------------------------------------------------------------------
  try:
    from PyQt4 import QtGui
    from PyQt4 import QtCore
    from PyQt4.QtCore import pyqtSlot
    from PyQt4.QtCore import pyqtSignal
    IsPyQt=True
    IsPySide=False
  except ImportError:
    from PySide import QtGui
    from PySide import QtCore
    from PySide.QtCore import Slot as pyqtSlot
    from PySide.QtCore import Signal as pyqtSignal
  #----------------------------------------------------------------------------------------
  import sys
  app = QtGui.QApplication(sys.argv)#创建Qt进程app
  #----------------------------------------------------------------------------------------
  #示例1
  values={'String':'This is String','float':-3.5,'int':-15}
  GroupBoxTitle='Please set values'
  title='the first example of QInputBox '
  rvalues=QInputBox(values=values,GroupBoxTitle=GroupBoxTitle,title=title)
  print(rvalues)
  #>>>{'int': -15, 'float': -3.5, 'String': 'This is String'}
  #----------------------------------------------------------------------------------------
  #示例2
  from collections import OrderedDict
  values=OrderedDict([('c', 1), (2, 2), ('a', 3)])
  rvalues1=QInputBox(values=values)
  print(rvalues1)
  #>>>OrderedDict([('c', 1), (2, 2), ('a', 3)])
  #----------------------------------------------------------------------------------------
  #示例3
  values={'String':'This is String','float':-3.5,'int':-15}
  GroupBoxTitle='Please set values'
  title='QInputBox'
  rvalues2=QInputBox(values=values,GroupBoxTitle=GroupBoxTitle,title=title)
  print(rvalues2)
  #>>>{'int': -15, 'float': -3.5, 'String': 'This is String'}
  #----------------------------------------------------------------------------------------
  sys.exit(app.exec_())

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

Python 相关文章推荐
python 自动提交和抓取网页
Jul 13 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 Python
python梯度下降法的简单示例
Aug 31 Python
python2 与 pyhton3的输入语句写法小结
Sep 10 Python
对python 匹配字符串开头和结尾的方法详解
Oct 27 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
Nov 21 Python
Python3多线程基础知识点
Feb 19 Python
python自动化之Ansible的安装教程
Jun 13 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
python标识符命名规范原理解析
Jan 10 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
python使用PyQt5的简单方法
Feb 27 #Python
Python创建字典的八种方式
Feb 27 #Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 #Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 #Python
Python使用字典的嵌套功能详解
Feb 27 #Python
Python list列表中删除多个重复元素操作示例
Feb 27 #Python
WxPython建立批量录入框窗口
Feb 27 #Python
You might like
PHP获取文件后缀名的三个函数
2012/10/15 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
jQuery select控制插件
2009/08/17 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
bootstrap中添加额外的图标实例代码
2017/02/15 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
Python pickle模块用法实例
2015/04/14 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
Python中反射和描述器总结
2018/09/23 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
详解爬虫被封的问题
2019/04/23 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
工程质量承诺书范文
2014/03/27 职场文书
小学语文教研活动总结
2014/07/01 职场文书
分享python函数常见关键字
2022/04/26 Python