侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 5年前   366

今天做了个基于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界面如下:

返回的结果中我们注意到字典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:[email protected]#~ 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=Falseexcept 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 QInputBoxdef 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_())

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


  • 上一条:
    pyside+pyqt实现鼠标右键菜单功能
    下一条:
    opencv与numpy的图像基本操作
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客