基于PyQt4和PySide实现输入对话框效果
作者:网海水手 发布时间:2023-06-11 13:30:58
标签:PyQt4,PySide,对话框
今天做了个基于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_())
来源:https://blog.csdn.net/rumswell/article/details/8878322
0
投稿
猜你喜欢
- 一、注释1.#单行注释2."""多行注释"""3.pycharm多行注释快捷键:
- 在开始之前先说一点,DOM是非常容易理解的,但是大家说的太官方,让人很是难于理解,我们就用非常简单的语言翻译一遍。加深对DOM的理解,从而对
- 整个重装步骤大致分四个步骤进行,第一步,备份原mysql中的所有数据库。第二步,完全卸载mysql第三步,下载安装新版mysql第四步,导入
- 在cssplay网站看到有一组CSS像素画,于是也想摩仿一下,于是在网络上找到一组头像图标,看其结构比较简单,就拿它开刀吧!先看看预览图图一
- 在这里我想有必要再较系统说一下ADO的各种对象的方法、属性。毕竟ADO不仅应用在ASP中,VB,VC都可以用到。在这十天中我想主要提到的对象
- 题目: 一个环形单链表,从头结点开始向后,指针每移动一个结点,就计数加1,当数到第m个节点时,就把该结点删除,然后继续从下一个节点开始从1计
- 这篇文章主要介绍了python全局变量引用与修改过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要
- 1、从MYSQL官方下载MYSQL的源码版本【一定要是源码版本】 2、按以下代码键入LINUX命令行 [注] 添加mysql组和用户 #gr
- help函数是python的一个内置函数,在python基础知识中介绍过什么是内置函数,它是python自带的函数,任何时候都可以被使。he
- 看完本篇文章你可以:同步本地和服务器的全部或者部分文件本地debug,服务器跑实验在这之前你要确保服务器上已经创建好虚拟环境你本地已经安装好
- 导语春节是中国特有的传统节日,中国结是中华民族特有的纯粹的文化精髓,富含丰富的文化底蕴,代表着我们对未来,对美好生活的向往和憧憬。新春佳节,
- 一、备份数据库1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server2、SQL Server组-->
- 首先输入一个矩阵:>>> b=[[1,2,3,4,5,6],[2,2,3,4,5,6],[3,2,3,4,5,6],[4,
- 前言前面已经讲述了如何获取股票的k线数据,今天我们来分析一下股票的资金流入情况,股票的上涨和下跌都是由资金推动的,这其中的北上资金就是一个风
- Blackfriday是在Go中实现的Markdown处理器。您可以安全地输入用户提供的数据,速度快,支持通用扩展(表,智能标点符号替换等)
- Python作为一门脚本语言,经常作为脚本接受命令行传入参数,Python接受命令行参数大概有三种方式。因为在日常工作场景会经常使用到,这里
- 本文实例讲述了Python中unittest的用法,分享给大家供大家参考。具体用法分析如下:1. unittest module包含了编写运
- 本文实例讲述了Python中xml和json格式相互转换操作。分享给大家供大家参考,具体如下:Python中xml和json格式是可以互转的
- 前言MySQL Innodb 的锁可以说是执行引擎的并发基础了,有了锁才能保证数据的一致性。众所周知,我们都知道 Innodb 有全局锁、表