基于PyQt4和PySide實(shí)現(xiàn)輸入對(duì)話框效果
今天做了個(gè)基于PyQt4和PySide的輸入對(duì)話框.已放到PyPi中,包名wlab,大家可以使用pip安裝:
pip install wlab
在程序輸入中,有時(shí)會(huì)要求同時(shí)改變多個(gè)參數(shù)值,而且類型也不盡相同,
這時(shí)下面的模塊比較徹底的解決了這個(gè)問題.先看個(gè)示例吧.
比如我們有三個(gè)參數(shù),分別為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界面如下:

返回的結(jié)果中我們注意到字典rvalues里面數(shù)據(jù)的類型和字典valuse中時(shí)一致的.
也就是說:
如果values中是整數(shù),那么rvalue中的值也是整數(shù);
如果value中是浮點(diǎn)數(shù),那么rvalue中的值也是浮點(diǎn)數(shù);
如果value中是字符串,那么rvalue中的值也是字符串;
目前只支持這三種類型.但對(duì)values中輸入?yún)?shù)并沒有沒有數(shù)目限制.
對(duì)于不會(huì)使用pip的新手,可以復(fù)制下面的文件:
#-*- 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
#~ #-------------------------------------------------
#~ #-------------------------------------------------
#~ #將字符串一特定的長(zhǎng)度輸出
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)#已自動(dòng)創(chuàng)建,無需再創(chuàng)建
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)#創(chuàng)建Qt進(jìn)程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_())
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python進(jìn)階之import導(dǎo)入機(jī)制原理詳解
在Python中,一個(gè).py文件代表一個(gè)Module。在Module中可以是任何的符合Python文件格式的Python腳本。了解Module導(dǎo)入機(jī)制大有用處??旄S小編一起學(xué)習(xí)一下吧2022-11-11
Django實(shí)現(xiàn)靜態(tài)文件緩存到云服務(wù)的操作方法
這篇文章主要介紹了Django實(shí)現(xiàn)靜態(tài)文件緩存到云服務(wù)的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Python使用BeautifulSoup庫解析網(wǎng)頁
在Python的網(wǎng)絡(luò)爬蟲中,網(wǎng)頁解析是一項(xiàng)重要的技術(shù)。而在眾多的網(wǎng)頁解析庫中,BeautifulSoup庫憑借其簡(jiǎn)單易用而廣受歡迎,在本篇文章中,我們將學(xué)習(xí)BeautifulSoup庫的基本用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2023-08-08
Python使用sorted對(duì)字典的key或value排序
這篇文章主要介紹了Python使用sorted對(duì)字典的key或value排序,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
Pytest實(shí)現(xiàn)setup和teardown的詳細(xì)使用詳解
這篇文章主要介紹了Pytest實(shí)現(xiàn)setup和teardown的詳細(xì)使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Python+Pygame實(shí)現(xiàn)趣味足球游戲
這篇文章主要為大家分享了一個(gè)基于Python和Pygame實(shí)現(xiàn)的一個(gè)趣味足球游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-05-05
windows7 32、64位下python爬蟲框架scrapy環(huán)境的搭建方法
這篇文章主要介紹了windows7 32、64位下python爬蟲框架scrapy環(huán)境的搭建方法,需要的朋友可以參考下2018-11-11
Python?opencv進(jìn)行圓形識(shí)別(圓檢測(cè))實(shí)例代碼
最近工作的項(xiàng)目上需要檢測(cè)圖像中是否有圓形,下面這篇文章主要給大家介紹了關(guān)于Python?opencv進(jìn)行圓形識(shí)別(圓檢測(cè))的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
python去重,一個(gè)由dict組成的list的去重示例
今天小編就為大家分享一篇python去重,一個(gè)由dict組成的list的去重示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
python 實(shí)現(xiàn)將list轉(zhuǎn)成字符串,中間用空格隔開
今天小編就為大家分享一篇python 實(shí)現(xiàn)將list轉(zhuǎn)成字符串,中間用空格隔開,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12

