当前位置: 移动技术网 > IT编程>脚本编程>Python > 基于PyQt4和PySide实现输入对话框效果

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

2019年05月28日  | 移动技术网IT编程  | 我要评论

赌城风云第五季,钢铁价格网,qq宠物神器传说辅助

今天做了个基于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: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_())

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网