基于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进阶篇之字典操作总结
Nov 16 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
Python多线程原理与用法详解
Aug 20 Python
Selenium定时刷新网页的实现代码
Oct 31 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
Jun 12 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
Python抖音快手代码舞(字符舞)的实现方法
Feb 07 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 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/03/27 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
微信支付的开发流程详解
2016/09/13 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python的装饰器使用详解
2017/06/26 Python
Python常见数字运算操作实例小结
2019/03/22 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
美术指导助理求职信
2014/04/20 职场文书
技术经济专业求职信
2014/09/03 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
国庆节标语大全
2014/10/08 职场文书
作风建设整改方案
2014/10/27 职场文书
2015年企业工作总结范文
2015/04/28 职场文书
交心谈心活动总结
2015/05/11 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
青年文明号创建口号大全
2015/12/25 职场文书
员工给公司的建议书
2019/06/24 职场文书
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript