基于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正则表达式操作指南(re使用)
Sep 06 Python
python写xml文件的操作实例
Oct 05 Python
简单理解Python中的装饰器
Jul 31 Python
python删除列表内容
Aug 04 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
我就是这样学习Python中的列表
Jun 02 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
Jul 22 Python
Python threading的使用方法解析
Aug 28 Python
python线程中的同步问题及解决方法
Aug 29 Python
pycharm工具连接mysql数据库失败问题
Apr 01 Python
pytorch简介
Nov 11 Python
Python实现微信表情包炸群功能
Jan 28 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
第二节 对象模型 [2]
2006/10/09 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
vue-axios使用详解
2017/05/10 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
JS实现吸顶特效
2020/01/08 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
Python实现堆排序的方法详解
2016/05/03 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
古驰英国官网:GUCCI英国
2020/03/07 全球购物
会议接待欢迎标语
2014/10/08 职场文书
法律服务所工作总结
2015/08/10 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang