基于wxPython的GUI实现输入对话框(2)


Posted in Python onFebruary 27, 2019

接着上一篇基于wxPython的GUI输入对话框1,继续学习。

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

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

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

from WInput import InputBox
values={'int':1,'String':'This is String','float':3.5}
title='Setting values:'
rvalues=InputBox(title,values)
print(rvalues)

显示GUI如下:

基于wxPython的GUI实现输入对话框(2)

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

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

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

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

title='Setting values:'
values={'Method':'LogLog','Value':3.5}
rvalues=InputBox(title,values)

生成的界面如下:

基于wxPython的GUI实现输入对话框(2)

WxInput模块的代码如下:

#-*- 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()
 
 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 
 
 
##~ #-------------------------------------------------
class InputFrame(wx.Frame):
 def __init__(self,title='InputFrame:',label='Setting values:',values={'int':1,'String':'This is String','float':3.5},size=(400,200)):
 '''
 #~ >>>IFrame = InputFrame(title='InputFrame:',label='Setting values:',values={'int':1,'String':'This is String','float':3.5},size=(400,200)):
  #~>>> rvalues=IFrame.GetValue()
 ''' 
 wx.Frame.__init__(self,parent=None,title = title,size=size) 
 self.modifiedvalues=values.copy()
 self.IPL = InputPanel(self,label=label,values=values)
 #~ #创建FlexGridSizer
 self.FlexGridSizer=wx.FlexGridSizer( rows=9, cols=1, vgap=5,hgap=5)
 self.FlexGridSizer.SetFlexibleDirection(wx.BOTH)
 
 self.RightPanel = wx.Panel(self,-1)
 
 #~ #测试按钮1
 self.Button1 = wx.Button(self.RightPanel,-1,"TestButton",size=(100,40),pos=(10,10))
 self.Button1.Bind(wx.EVT_BUTTON,self.GetValue)
 #~ #加入Sizer中
 self.FlexGridSizer.Add(self.Button1,proportion =0, border = 5,flag = wx.ALL | wx.EXPAND)
 self.RightPanel.SetSizer(self.FlexGridSizer) 
 self.BoxSizer=wx.BoxSizer(wx.HORIZONTAL) 
 self.BoxSizer.Add(self.IPL,proportion =-10, border = 2,flag = wx.ALL | wx.EXPAND)
 self.BoxSizer.Add(self.RightPanel,proportion =0, border = 2,flag = wx.ALL | wx.EXPAND)
 self.SetSizer(self.BoxSizer) 
 self.Center(wx.BOTH)
 #~ #按钮事件,用于测试
 def GetValue(self,event):
 self.modifiedvalues=self.IPL.GetValue()
 #~ print(self.modifiedvalues)
 return self.modifiedvalues
 
#~ #主程序测试
def TestInputFrame():
 app = wx.PySimpleApp()
 title='InputFrame:'
 label='Setting values:'
 values={'int':234,'String':'This is String','float':3.5} 
 frame =InputFrame(title,label,values)
 frame.Show()
 app.MainLoop()
 return
 
if __name__ == '__main__':
 app = wx.PySimpleApp()
 title='InputFrame:'
 label='Setting values:'
 values={'int':234,'String':'This is String','float':3.5} 
 frame =InputFrame(title,label,values)
 frame.Show()
 app.MainLoop()

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

Python 相关文章推荐
python直接访问私有属性的简单方法
Jul 25 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
Python字符串处理实现单词反转
Jun 14 Python
深入理解Django中内置的用户认证
Oct 06 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
pandas.cut具体使用总结
Jun 24 Python
简单了解python高阶函数map/reduce
Jun 28 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
Python django框架 web端视频加密的实例详解
Nov 20 Python
python 可视化库PyG2Plot的使用
Jan 21 Python
Python深度学习之实现卷积神经网络
Jun 05 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 #Python
Python使用字典的嵌套功能详解
Feb 27 #Python
Python list列表中删除多个重复元素操作示例
Feb 27 #Python
WxPython建立批量录入框窗口
Feb 27 #Python
Python里字典的基本用法(包括嵌套字典)
Feb 27 #Python
Python中类的创建和实例化操作示例
Feb 27 #Python
Python中使用遍历在列表中添加字典遇到的坑
Feb 27 #Python
You might like
利用PHP创建动态图像
2006/10/09 PHP
目录,文件操作详谈―PHP
2006/11/25 PHP
php实现Session存储到Redis
2015/11/11 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
JS产生随机数的用法小结
2016/12/10 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
python pandas库的安装和创建
2019/01/10 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
linux面试相关问题
2013/04/28 面试题
生态养殖创业计划书
2014/05/06 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
安全生产月标语
2014/10/07 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
高中班主任寄语
2019/06/21 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
JavaScript的function函数详细介绍
2021/11/20 Javascript
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL
vue如何清除浏览器历史栈
2022/05/25 Vue.js