基于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 23 Python
python文件操作相关知识点总结整理
Feb 22 Python
利用Python爬取微博数据生成词云图片实例代码
Aug 31 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
django框架cookie和session用法实例详解
Dec 10 Python
基于Python实现2种反转链表方法代码实例
Jul 06 Python
Python Django路径配置实现过程解析
Nov 05 Python
python中round函数保留两位小数的方法
Dec 04 Python
python中count函数知识点浅析
Dec 17 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获取文件大小的方法
2014/02/26 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
JavaScript this 深入理解
2009/07/30 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
2011/08/20 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
python 获取本机ip地址的两个方法
2013/02/25 Python
python有证书的加密解密实现方法
2014/11/19 Python
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
python 类详解及简单实例
2017/03/24 Python
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
单链表反转python实现代码示例
2018/02/08 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
建材业务员岗位职责
2013/12/08 职场文书
关于环保的标语
2014/06/13 职场文书
反对邪教标语
2014/06/30 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
招标保密承诺书
2015/01/20 职场文书
2014年度个人总结范文
2015/03/09 职场文书
民事代理词范文
2015/05/25 职场文书
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏