基于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简单程序读取串口信息的方法
Mar 13 Python
Python按行读取文件的简单实现方法
Jun 22 Python
Python实现读取文件最后n行的方法
Feb 23 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
python 列表降维的实例讲解
Jun 28 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
Dec 28 Python
Python Gitlab Api 使用方法
Aug 28 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
Python爬虫如何应对Cloudflare邮箱加密
Jun 24 Python
python利用paramiko实现交换机巡检的示例
Sep 22 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 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支持页面回退的两种方法
2008/01/10 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
jQuery Selector选择器小结
2010/05/06 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
Python编写屏幕截图程序方法
2015/02/18 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
报关报检委托书
2014/04/08 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
区域经理岗位职责
2015/02/02 职场文书
小石潭记导游词
2015/02/03 职场文书
营运督导岗位职责
2015/04/10 职场文书
正规欠条模板
2015/07/03 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
MySQL慢查询的坑
2021/04/28 MySQL
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android