基于wxpython的GUI输入对话框2

在程序输入中,有时会要求同时改变多个参数值,而且类型也不尽相同,

这时TextEntryDialog就显得不适用了.WxInput模块则比较彻底的解决了这个问题.

比如我有三个值要用户交互式设置,一个是int数,一个是str,一个是float,先看示例文件:

[python]
from WInput import InputBox
values={'int':1,'String':'This is String','float':3.5}
title='Setting values:'
rvalues=InputBox(title,values)
print(rvalues)
from WInput import InputBox
values={'int':1,'String':'This is String','float':3.5}
title='Setting values:'
rvalues=InputBox(title,values)
print(rvalues)显示GUI如下:

上面的代码的关键是设置字典values的值.

WxInput会自动根据字典values的内容生成输入界面,

而且返回值的类型确保和原始类型一样.

再比如程序中有任意两个参数Method和num要设置,那么如下就可了:

[html]
title='Setting values:'
values={'Method':'LogLog','Value':3.5}
rvalues=InputBox(title,values)
title='Setting values:'
values={'Method':'LogLog','Value':3.5}
rvalues=InputBox(title,values)
生成的界面如下:

WxInput模块的代码如下:

[python]
#-*- coding:utf-8 -*-
#~ #--------------------------------------------------------------------------------
#~ module:wlab
#~ FileName=WInput.py
#~ Funciton:wx的输入对话框
#~ author:吴徐平
#~ Date:2013-04-28
#~ Email:539688300@qq.com
#~ #-------------------------------------------------
import wx
import wx.lib.sized_controls as wxsc
#~ #-------------------------------------------------
#~ #set value for widgets( StaticText and TextCtrl) height
wh=30
#~ #set value for max width times
mwt=8
#~ #set value for wh times
wht=3
#~ #-------------------------------------------------
class InputDialog(wxsc.SizedDialog):
def __init__(self,title='Setting values:',values={'int':1,'String':'This is String','float':3.5}):
'''''
#~ using it as follow:
#~ dialog = InputDialog(title='Setting values:',values={'int':1,'String':'This is String','float':3.5})
#~ just for test:
#~ dialog = InputDialog()
'''
style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER
wxsc.SizedDialog.__init__(self,parent=None, id=-1, title=title, style=style)
self.originvalues=values.copy()
self.modifiedvalues=values.copy()
self.pane = self.GetContentsPane()
self.pane.SetSizerType("form")

maxlen1=mwt*max([len(str(key)) for key in values])
if maxlen1<wh*wht:
maxlen1=wh*wht
maxlen2=mwt*max([len(str(values[key])) for key in values])
if maxlen2<wh*wht:
maxlen2=wh*wht
for key in self.modifiedvalues:
keyStr=str(key)
label=keyStr+' :'
StaticText = wx.StaticText(parent=self.pane,id=-1,label=label,style=wx.ALIGN_RIGHT)
StaticText.SetInitialSize((maxlen1,wh))
value=str(self.modifiedvalues[key])
TextCtrl = wx.TextCtrl(parent=self.pane, id=-1,value=value)
TextCtrl.SetInitialSize((maxlen2,wh))
TextCtrl.SetSizerProps(expand=True)
#~set a name for TextCtrl,so later we can use wx.FindWindowByName()
TextCtrl.Name='TC_'+str(keyStr)
#StaticText.Name='ST_'+str(keyStr)

#~ # add dialog buttons
self.SetButtonSizer(self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL))
self.Fit()
self.Center()
def GetOriginValue(self):
'''''
#~ if the user select wx.ID_CANCEL,then return originvalues
'''
return self.originvalues
def GetValue(self):
'''''
#~ if the user select wx.ID_OK,then return self.modifiedvalues
'''
for key in self.modifiedvalues:
keyStr=str(key)
TextCtrlName='TC_'+str(keyStr)
TextCtrl=self.FindWindowByName(TextCtrlName)
ovk=self.modifiedvalues[key]
if(type(ovk)==int):
self.modifiedvalues[key]=int(TextCtrl.GetValue().strip())
elif(type(ovk)==float):
self.modifiedvalues[key]=float(TextCtrl.GetValue().strip())
else:
self.modifiedvalues[key]=str(TextCtrl.GetValue())
return self.modifiedvalues
#~ #-------------------------------------------------
def InputBox(title='Setting values',values={'int':1,'String':'This is String','float':3.5}):
'''''
#~ >>>values={'int':1,'String':'This is String','float':3.5}
#~ >>>title='Setting values:'
#~ >>>rvalues=InputBox(title,values)
#~ >>>print(rvalues):
'''
app = wx.PySimpleApp()
dialog = InputDialog(title=title,values=values)
if dialog.ShowModal() == wx.ID_OK:
values= dialog.GetValue()
else:
values=dialog.GetOriginValue()
dialog.Destroy()
app.MainLoop()
return values
##~ #测试InputBox
#if __name__ == '__main__':
#values={'int':1,'String':'This is String','float':3.5}
#title='Setting values'
#rvalues=InputBox(title,values=values)
#print(rvalues)
##~ #-------------------------------------------------
class InputPanel(wx.Panel):
def __init__(self,parent,label='Setting values:',values={'int':1,'String':'This is String','float':3.5}):
'''''
#~ >>>ipl = InputPanel(parent,label='Setting values:',values={'int':1,'String':'This is String','float':3.5})
#~>>> rvalues=ipl.GetValue(self)
'''
wx.Panel.__init__(self,parent=parent, id=-1)
self.modifiedvalues=values.copy(2881064151)
box = wx.StaticBox(self, -1, label=label)
sbsizer = wx.StaticBoxSizer(box, wx.VERTICAL)
gridsizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)

maxlen1=mwt*max([len(str(key)) for key in values])
if maxlen1<wh*wht:
maxlen1=wh*3
maxlen2=mwt*max([len(str(values[key])) for key in values])
if maxlen2<wh*wht:
maxlen2=wh*wht
for key in self.modifiedvalues:
keyStr=str(key)
label=keyStr+' :'
StaticText = wx.StaticText(parent=self,id=-1,label=label,style=wx.ALIGN_RIGHT)
StaticText.SetInitialSize((maxlen1,wh))
gridsizer.Add(StaticText, 0, wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 3)
value=str(self.modifiedvalues[key])
TextCtrl = wx.TextCtrl(parent=self, id=-1,value=value)
TextCtrl.SetInitialSize((maxlen2,wh))
gridsizer.Add(TextCtrl, 0, wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 3)
#~set a name for TextCtrl,so later we can use wx.FindWindowByName()
TextCtrl.Name='TC_'+str(keyStr)
sbsizer.Add(gridsizer, 1, wx.EXPAND)
gridsizer.Layout()
PanelSizer = wx.BoxSizer(wx.VERTICAL)
PanelSizer.Add(sbsizer, 0, wx.ALL|wx.EXPAND, 5)
self.SetSizer(PanelSizer)
PanelSizer.Layout()
PanelSizer.Fit(self)
def GetValue(self):
'''''
#~ return self.modifiedvalues
'''
for key in self.modifiedvalues:
keyStr=str(key)
TextCtrlName='TC_'+str(keyStr)
TextCtrl=self.FindWindowByName(TextCtrlName)
ovk=self.modifiedvalues[key]
if(type(ovk)==int):
self.modifiedvalues[key]=int(TextCtrl.GetValue().strip())
elif(type(ovk)==float):
self.modifiedvalues[key]=float(TextCtrl.GetValue().strip())
else:
self.modifiedvalues[key]=str(TextCtrl.GetValue())
return self.modifiedvalues

WxInput模块则比较彻底的解决了这个问题的更多相关文章

  1. 故障模块名称: NetdiskExt64.dll的解决之法

    故障模块名称: NetdiskExt64.dll的解决之法 2013年8月5日 开机,资源管理器报错.详细报错信息如下:   问题签名:   问题事件名称:    APPCRASH   应用程序名:  ...

  2. python使用pip安装第三方模块遇到的问题及解决方法

    python使用pip安装第三方模块遇到的问题及解决方法 关注公众号"轻松学编程"了解更多. 使用国内源: 清华:https://pypi.tuna.tsinghua.edu.cn ...

  3. win安装python模块出现依赖问题的解决方法 & No module named 'MySqldb'

    前言 一年多了,还在写这种问题,羞愧. 新公司不让用自己的电脑,配的winPC,项目启不起来,之前也出现过这个问题,是py3缺少某个模块,但是自己没记,这次记一下好了. No module named ...

  4. python模块名和文件名冲突解决

    对于python初学者,很容易练习到一个随机数生成的程序,代码如下: #!/usr/bin/python import random print(random.randint(12,20)) 这个小程 ...

  5. Python在安装第三方模块遇到的问题及解决办法

    今天在安装第一个模块psutil的时候出现了以下问题: 1.找不到Python.h文件 解决办法:重新安装python环境:sudo apt-get install python-dev 说明:网上有 ...

  6. Mac MySQLdb模块安装,可算解决了

    转载:http://blog.csdn.net/janronehoo/article/details/25207825 短评:这篇文章感觉是比较全面解决Mac MySQLdb模块安装问题的文章了,特别 ...

  7. dedecms问答模块时间显示1970-01-01的解决办法

    在使用dedecms的问答模块的时候,很多人希望能在模板上加上问题的时间,一般我们采用这样的dede标签: {dede:ask row=24 titlelen='50' sort='ok'}   &l ...

  8. pycharm的MySQLdb模块导不进去时解决办法

    一.Windows下python2.7安装MySQLdb模块 根据Python多少位下载对应版本: 32位:https://pypi.python.org/pypi/MySQL-python/1.2. ...

  9. VMWare虚拟机提示:锁定文件失败,打不开磁盘...模块"Disk"启动失败的解决办法

    我出现该问题的原因: 昨天电脑一下子卡死,于是我就重启了电脑,重启之后我没有打开VMware虚拟机,结果第二天一上班打开VMware就发现出现了“锁定文件失败,打不开磁盘......模块"D ...

随机推荐

  1. JAVA Day5

                                         数组   1.数组是一组变量的集合,存储“相同数据类型”的一组数据: 连续的空间. 2.声明一个变量就是在内存空间划出一块合适 ...

  2. poj1753 bfs+奇偶性减枝//状压搜索

    http://poj.org/problem?id=1753 题意:有个4*4的棋盘,上面摆着黑棋和白旗,b代表黑棋,w代表白棋,现在有一种操作,如果你想要改变某一个棋子的颜色,那么它周围(前后左右) ...

  3. iOS10 UI教程禁用视图与用户的交互

    iOS10 UI教程禁用视图与用户的交互 在上文中我们提到了使用isHidden属性和alpha属性可以使视图与用户的交互被禁用,除此之外此功能还可以使用UIView的isUserInteractio ...

  4. Swift3.0语言教程分割字符串与截取字符串

    Swift3.0语言教程分割字符串与截取字符串 Swift3.0语言教程分割字符串 如果想要快速的创建一个数组,我们可以将字符串进行分割,分割后的内容将会生成一个数组.在NSString中有两个分割字 ...

  5. 仓库、超市、服装、食品、批发零售手持打印PDA开单器-现场无线开单扫描 无线传输电脑

    深圳浩瀚技是一家主要从事手持数据终端硬件.软件研究.销售服务为一体的高新企业公司.公司主要销售进销存等无线开单系统.工业级手持PDA,安卓数据采集器,RFID阅读器等设备.我们秉承“诚信.敏捷.繁荣” ...

  6. Android手机自动化测试真机运行

    一,    打开手机的USB调试模式 不同的手机有不同的方法打开usb调试模式,可是去网上查一下你手机的调试模式打开办法(http://wenku.baidu.com/view/3077f06c25c ...

  7. 解决Genymotion无法创建新设备或无法显示设备列表问题

    准备工作: 链接: https://pan.baidu.com/s/1i5v4IBN 密码: jc3m 用2.8的和最新VirtualBox-5.1.10-112026-Win 注意事项: 1.笔记本 ...

  8. jdbc 各驱动写法

    1.Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); ...

  9. ajax 异步交互

    <script>     $(function(){         $("#sub").click(function () {             $.ajax( ...

  10. LA4671 K-neighbor substrings(FFT + 字符串Hash)

    题目 Source http://acm.hust.edu.cn/vjudge/problem/19225 Description The Hamming distance between two s ...