加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Python:tkinter-Parent获取弹出窗口的返回值

(2013-10-17 14:38:36)
标签:

callback

子窗口

返回值

it

分类: python
http://blog.sina.com.cn/s/blog_ac9fdc0b0101naol.html
本来是想解决pyqt上的一个问题,困扰了我快一天了啊.虽然这个是tkinter写的,事实证明最后也没有帮上忙,但是学习一下callback还是很不错的
获取窗口对象的返回值是一个很常见的模型,比如程序弹出一个窗口,读取用户的输入值,这个值可以很容易的保存在弹出的窗口中,但问题在于如何将这个值传递给弹出窗口的parent。这是一个看似很simple的问题,但真正操作起来才发现是自己too young~~~
******************************************************************************************************
    先简单的描述需要解决一个什么问题,下面只是一个框架:
http://s16/mw690/ac9fdc0btdf589ca2474f&690
它运行的结果如下:
http://s11/mw690/ac9fdc0btdf589ea0cdaa&690
点击Enter,会弹出窗口如下:
http://s16/mw690/ac9fdc0btdf58a24bcfff&690
  OK,问题就是在这里输入后,将这个输入的值传递给调用它的主程序
*******************************************************************************************************
    为了解决这个问题,首先需要明白一个概念:所有独立运行的窗口(Toplevel widget),都是一个独立的线程
    为了使这个概念更加的明显,将整个弹出窗口封装成一个类型,然后在主窗口中点击Enter时,创建这个窗口,代码如下:
http://s11/mw690/ac9fdc0b07cbc12c2aa8a&690
这里将创建Toplevel窗口的代码封装在了一个类型PopUp中,为了说明"所有独立运行的窗口(Toplevel widget),都是一个独立的线程"这句话,在创建PopUp后,调用tkMessageBox.showinfo()来弹出一个指示性的窗口,下面是点击主窗口Enter键之后的结果:
http://s2/mw690/ac9fdc0b4df58c5a43ed1&690
由结果可以看出,程序不会阻塞在创建TopLevel那里,等待你完成输入销毁,而是直接创建一个新的线程来运行。这也是Toplevel widget的特殊之处,一般的widget运行都需要调用.mainloop()函数。
******************************************************************************************************
    所有独立运行的窗口(Toplevel widget),都是一个独立的线程。这是GUI设计一个惯有的问题,它使得用户的所有操作只能异步的进行。所以针对本文开头所提出的问题,实现这个功能的代码只能在PopUp类型的Button Widget的callback函数中,弄清楚这一点就胜利了一大半。
http://s13/mw690/ac9fdc0b4df58e4e753dc&690
上面已经完成了全部的框架,只剩下第30行注释的部分,这部分代码的功能将PopUp读取用户的值传递给Gui
*****************************************************************************************************
    下面是完整的解决办法,从Gui中传递一个可变的对象(这里是关键,想想为嘛不能传递string进去),然后在PopUp中记录传入的值,这样这个值就保存在可变的对象中了,这里类似与C++的传引用方法
http://s6/mw690/ac9fdc0btdf590b04f7f5&690
下面是结果:
http://s9/mw690/ac9fdc0b4df59170e8178&690
点击pop_up,弹出PopUp,输入:
http://s3/mw690/ac9fdc0b4df59196a4f42&690
完成输入后,点击show显示结果:
http://s15/mw690/ac9fdc0b07cbc1c74843e&690
反正这一块最重要的是需要明白为啥使用list,而不是使用string,下面这篇文章就说明了区别:
http://blog.sina.com.cn/s/blog_ac9fdc0b0101n44r.html
******************************************************************************************************
    上面是利用Tkinter内置的Toplevel Widget实现,实际上也可以创建自己的类型,唯一的区别在于自己创建的类型需要显式的调用mainloop()函数,不过说的容易,实现起来难很多。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有