人生的意义就是思考其意义分享 http://blog.sciencenet.cn/u/qianlivan 天体物理工作者,家乡云南昆明。

博文

IDL 创建窗口

已有 10549 次阅读 2011-12-15 16:42 |个人分类:知识|系统分类:科研笔记| IDL, 窗口, 控件

一直以来我都觉得写程序创建一个窗口,添加些按钮,显示些会变化的文字是十分神奇的事。但是又懒又笨,一直没学会。最近开始考虑做一个观测模拟系统,模拟一个射电天文望远镜的控制界面。这种东西每个望远镜都由,估计代码也可以搞到,但是总觉得自己写的用起来才比较舒服。于是终于下定决心自己写几个窗口。

C语言写窗口估计是比较通用,但对于我来说可能太困难了,我估计连如何编译都学不会。于是最终决定用IDL。上网搜了一下并结合IDL帮助文档,我在用IDL创建窗口的道路上走了5步,大概有了点概念。

总的来说,IDL是先创立一个基本窗口,里面没有东西,代码如下。
PRO experiment_event, ev
print,'draw event',ev.x,ev.y,ev.press,ev.release ; 分别打印出点下鼠标的坐标和松开鼠标的坐标,此句会有两行输出
END

PRO experiment
main = WIDGET_BASE() ; 此处是建立一个基本窗口
draw = WIDGET_draw(main, /button_events); 在基本窗口中建立一个画图窗口,而且起到按钮的功能(对鼠标点击有反应)
WIDGET_CONTROL, main, /REALIZE ; 此句将窗口画出
XMANAGER, 'experiment', main ; 在窗口中进行的操作应写在此句之前,
                             ; 单引号中的单词应该第一个自过程中_event前的单词相同
END


有了基本窗口之后,就可以在此窗口内再创建窗口或者按钮。

PRO experiment_event, ev
widget_control, ev.id, get_uvalue=uvalue

 CASE uvalue of ; 由于定义了两个控件(窗口):一个按钮、一个画图窗口,所以分情况对待
  'go' : print,'GO button'
  'draw' : print,'draw event',ev.x,ev.y,ev.press,ev.release
 END
END
PRO experiment2
main = WIDGET_BASE(title='OTF experiments',/row)
btn = widget_button(main,uvalue='go',value='GO')
draw = WIDGET_draw(main,uvalue='draw', /button)
WIDGET_CONTROL, main, /REALIZE
XMANAGER, 'experiment', main,/no_block
END


窗口的大小可以通过xsize和ysize控制。

PRO experiment_event, ev
widget_control, ev.id, get_uvalue=uvalue

 CASE uvalue of
  'go' : print,'GO button'
  'draw' : print,'draw event',ev.x,ev.y,ev.press,ev.release
 END
END


PRO experiment3
main = WIDGET_BASE(title='OTF experiments',/row,/frame,xsize=500,ysize=500)
cntl = widget_base(main,/column,/frame,xsize=100,ysize=100)
btn = widget_button(cntl,uvalue='go',value='GO')
draw = WIDGET_draw(main,uvalue='draw', /button)
WIDGET_CONTROL, main, /REALIZE
XMANAGER, 'experiment', main,/no_block
END

按钮的功能可以定义为关闭窗口,还可以在画图窗口画一个图。

PRO experiment_event, ev
widget_control, ev.id, get_uvalue=uvalue
widget_control, ev.top, /destroy ; 按QUIT按钮的时候关闭窗口
 CASE uvalue of
  'quit' : print,'QUIT button'
  'draw' : print,'draw event',ev.x,ev.y,ev.press,ev.release
 END
END

PRO experiment4
main = WIDGET_BASE(title='OTF experiments',/row,/frame,xsize=500,ysize=500)
cntl = widget_base(main,/column,/frame,xsize=100,ysize=100); 定义一个子窗口
btn = widget_button(cntl,uvalue='quit',value='QUIT',xsize=100,ysize=100);在子窗口中放一个按钮
draw = WIDGET_draw(main,uvalue='draw', /button,xsize=300,ysize=300)
WIDGET_CONTROL, main, /REALIZE
a=indgen(100,100)
tv,a ; 在画图窗口画一个图
XMANAGER, 'experiment', main,/no_block ; note this name in '' must be the same
                                      ; as that before _event in last PRO!!!
END

原则上可以加很多按钮,实现不同功能,画图窗口也可以调整。

PRO experiment_event, ev
widget_control, ev.id, get_uvalue=uvalue
;widget_control, ev.top, /destroy
widget_control, ev.top, get_uvalue=textwid
 CASE uvalue of
  'one' : widget_control, textwid, set_value='Button 1 Pressed'
  'two' : widget_control, textwid, set_value='Button 2 Pressed'
  'quit' : widget_control, ev.top, /destroy
;   'draw' : print,'draw event',ev.x,ev.y,ev.press,ev.release
 ENDCASE
END

PRO experiment5
main = WIDGET_BASE(title='OTF experiments',/row,/frame,xsize=600,ysize=500)
;cntl = widget_base(main,/row,/frame,xsize=100,ysize=100)
cntl = widget_base(main,/column,/frame,xsize=100,ysize=100)
;cntl = main
btn1 = widget_button(cntl,uvalue='one',value='ONE',xsize=100,ysize=62)
btn2 = widget_button(cntl,uvalue='two',value='two',xsize=100,ysize=62)
btn = widget_button(cntl,uvalue='quit',value='QUIT',xsize=100,ysize=62)
text = widget_text(main,xsize=20)
draw = WIDGET_draw(main,uvalue='draw', /button,xsize=300,ysize=300)
widget_control, main, set_uvalue=text
WIDGET_CONTROL, main, /REALIZE
a=indgen(300,300)
tv,a
XMANAGER, 'experiment', main,/no_block ; note this name in '' must be the same
                                      ; as that before _event in last PRO!!!
END
 

接下来要做的是就是写一个内核了,生成一些可以往窗口里方的东西,开更多的窗口也没有原则性困难了。


https://blog.sciencenet.cn/blog-117333-518785.html

上一篇:关于Windows c盘磁盘空间低
下一篇:类比与天文学发展——读《通向实在之路》(一)
收藏 IP: 159.226.169.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-7-17 06:29

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部