Chapter 11. Frame, MainWindow, and Toplevel Widgets   框架,主窗体,顶级部件





框架和Toplevels 都是设计用于其他部件的容器。





它们的不同在两个方面:









在它们的默认设置和和其他部件的关系。





一个Frame,默认 没有明显的边界,relief 或者任何其他表明 它是在那里,





而所有的Toplevel 部件有装饰 





一个Toplvel 可以操作单独的其他的顶级部件,  





但是Frame 总是需要一个parent(一个Toplevle或者其他Frame)  它不能是单独的:









我们已经看到很多的例子使用Toplevel widgets, 部件通过调用MainWindow->new 创建





通常是一个Toplevel widget,如果你打印这个变量 ,你会看到这样的东西:





print "$mw\n";    # prints: MainWindow=HASH(0x909a2d0)













这个窗口是被指定因为它自动的显示它本身, 当你调用Mainloop.









在其他方面, MainWindow widget 是一个Toplevel。









通过创建一个Toplevel widget,你可以创建另外一个窗口 作为你应用的一部分。





其他的Toplevel widgets 在你的程序里 必须被显示的显示 在代码里









当你使用一个额外的Toplevel 是一个设计决定 ,你必须做。









你需要使用另外一个Toplevel widget 代替MainWindow





如果这里有太多的信息来适应这个窗口。









使用Toplevels 来组织信息也是一个好的主意,你不需要有太多的窗口 对于用户导航栏,









但是一个好的设计的应用可能会使用一到2个









这里有一些例子使用  Toplevel widgets:





显示一个关闭按钮的信息文本:





看看 Tk::Dialog. 它是设计做这个,使用一个 Toplevel widget:









提供数据收集输出不同的Toplevel windows 有用户比如点击按钮触发













Frame 部件的整个目的是提供一个其他部件的容器, 它看起来是重要的,









Perl/Tk的 的布局管理器 提供了一些限制(查看 章节2  布局管理器)









我们可以使用Frames 来帮助把工作做的更好。









我们会pack 作为我们简单的布局管理器通过这个章节,因为它是最流行的,









但是记住 使用一个Frame 最基本的规则 适用于其他布局管理器













当一个Frame 包含其他的部件,它容纳了部件的大小 在他里面,









如果你没有任何部件部署在Frame里,  你不会看到Frame.









如果部件在Frame是被重新调整 由于一些原因, Frame也会尝试resize .









11.1. Creating a Frame  创建一个Frame:









创建一个框架部件 没有什么特别的,除了你通常保存一个引用到部件,所以你可以把其他的东西放在它里面:













Frame的父窗体是一个MainWindow,一个Toplevel, 或者其他的Frame 部件。









当部件被创建后,它可能变成一个父窗体对于其他部件。









你必须已经创建了Frame,但是需要不是在屏幕上的 ,变成其他部件的父窗体。









记住,  即使你部署其他部件在你的Frame里, 如果你不部署 Frame,其他的部件不会出现在屏幕上。









从技术上讲, 任何部件可以是其他部件的父部件,  但是生活要简单点 当部件是一个窗体的child









11.2  创建一个Toplevel Widget:





要创建一个Toplevel,  从需要的父部件调用Toplevel,通常 MainWindow 部件

(通过 MainWindow->new( )) 创建。









返回的条目是一个引用到Toplevel widget;  引用允许你配置部件,









调用方法,这里有一个简单的例子:





use Tk;

$mw = MainWindow->new;

$mw->title("MainWindow");

$mw->Button(-text => "Toplevel", -command => \&do_Toplevel)->pack( );





MainLoop;

sub do_Toplevel {

  if (! Exists($tl)) {

    $tl = $mw->Toplevel( );

    $tl->title("Toplevel");

    $tl->Button(-text => "Close", 

                -command => sub { $tl->withdraw })->pack;

  } else {

    $tl->deiconify( );

    $tl->raise( );

  }

}









当你允许这个程序,  点击Toplevel 按钮 在MainWindow 创建Toplevel widget(如果需要的化)





然后显示它, 点击关闭隐藏Toplevel。









你需要Toplevel部件的存在 在你显示它之前,因为你不要重新创建 它如果它已经存在,









你不需要尝试显示一些  不存在的













当你的关闭按钮被点击, Toplevel 被撤回。 它仍旧存在, 只是对用户不可见。









这个节约时间 下一次重新显示相同的窗口。









你也可以使用 撤走 如果你不需要显示部件 当你用小部件填满。









简单地使用 withdraw 方法,   不是内部的部件,









然后使用deiconify and raise 来重新显示部件:













11.5. Toplevel Methods  Toplevel 部件:





Toplevel 部件 方法被列出,下面章节会被解释。









重要的是要注意所有这些方法也应用于一个MainWindow 









一个MainWindow 是一个指定的部件。





也请记住,大量的方法最初被设计用于使用一个Unix windowing environment, 





其中不少规定在Win32上没有影响。









很多那些函数 没有任何作用罪域典型的Perl/Tk应用,但是记录他们在这里:





11.6. Creating Multiple MainWindows 创建多个 MainWindows :









有时候,你可能需要创建多个MainWindows 在相同的程序,典型的,









有两个MainWindows  在一个应用里 不是一个明智的注意,









因为位图和凸显不能在MainWindows 之间贡献。









一些Tk模块贡献时是不可靠的。









但不管怎么说我们要探索它,因为它是一个有趣的练习。









来显示它是如何完成的, 我们会开始一个更先进的 "Hello Worlds"  程序,









之所以这么叫是因为它使用了两个主窗体:









你可能想知道什么有用的程序可能存在 利用多于一个的屏幕。









非线性数字视频编辑软件就是一个很好的例子。









高分辨率屏幕显示电影的过程,另外一个屏幕包含编辑控制。









我们的小项目开始通常够用,导入所有需要的Tk符号,子程序, 变量,类,部件,和方法。









然后打开第一个MainWindow, $mv1,以正常方式:





它运行严格和启用warnings,  大部分的程序在本书中都是这样





#!/usr/local/bin/perl -w

#

# Advanced Hello World program using two MainWindows.





use Tk;

use subs qw/beep/;

use strict;





my $mw1 = MainWindow->new;





默认情况下, MainWindow 打开它的窗口来显示通过$ENV{DISPLAY}, 





通常在Unxi上是:0(假设你没有指定它 在其他地方)









屏幕号码是解释为 至少2种方式,如果有多个物理屏幕 逻辑上作为一个。





他们被定位通过屏幕号码。





屏幕是对待为一个连续的局域, 因此如果你需要移动一个窗口从一个屏幕到另外一个,









就抓住它并拖动它。  









我们打开第2个MainWindow 就像 第一个一样,但是提供了命令行 勾选 来发送它到其他地方





my $mw2 = MainWindow->new(-screen => $ARGV[0] ||= $ENV{DISPLAY});

$mw1->Button(-text => 'MainWindow 1 Bell', -command => [\&beep, $mw1])->pack;

$mw1->Button(-text => 'MainWindow 2 Bell', -command => [\&beep, $mw2])->pack;

$mw1->Button(qw/-text Quit -command/ => \&exit)->pack;





MainLoop;





sub beep {shift->bell}





请注意  MainWindow的构造参数是 -screen 不是 -display  





如果在命令行 什么都没指定,那么两个窗口出现正在相同的屏幕:





现在部署3个按钮在第一个MainWindow , 设置一个简单的回调 来响铃  在每个窗口

Chapter 11. Frame, MainWindow, and Toplevel Widgets 框架,主窗体,顶级部件的更多相关文章

  1. Chapter 4. Button, Checkbutton, and Radiobutton Widgets 按钮,复选按钮,单选按钮

    Chapter 4. Button, Checkbutton, and Radiobutton Widgets   按钮,复选按钮,单选按钮 几乎所有的Perl/Tk 应用使用按钮以这样或者那样的方式 ...

  2. 零元学Expression Blend 4 - Chapter 11 用实例了解布局容器系列-「Border」

    原文:零元学Expression Blend 4 - Chapter 11 用实例了解布局容器系列-「Border」 将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器是Blend ...

  3. 内部框架——axure线框图部件库介绍

    网页框架代码<iframe border=0 name=lantk src="要嵌入的网页地址" width=400 height=400 allowTransparency ...

  4. JavaWeb_(Mybatis框架)主配置文件介绍_四

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  5. Think Python - Chapter 11 - Dictionaries

    Dictionaries A dictionary is like a list, but more general. In a list, the indices have to be intege ...

  6. C++11实现一个轻量级的AOP框架

    AOP介绍 AOP(Aspect-Oriented Programming,面向方面编程),可以解决面向对象编程中的一些问题,是OOP的一种有益补充.面向对象编程中的继承是一种从上而下的关系,不适合定 ...

  7. java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧

    11. 6 调试技巧 1)一个不太为人所知却非常有效的技巧是在每个类中放一个main方法,这样就可以对每个类进行单元测试.这个方法可以保留,因为在java虚拟机只调用启动类的main方法. 2)   ...

  8. Thinking in Java from Chapter 11

    From Thinking in Java 4th Edition 持有对象 // Simple container example (produces compiler warnings.) // ...

  9. go chapter 11 初始化 map 数组

    // 初始化 map m1 = make(map[string]string) // 初始化 数组 var array3 = []int{9, 10, 11, 12} var a [4]int a[0 ...

随机推荐

  1. TD数量不确定时如何让其宽度平均分布

    D数量不确定时如何让其宽度平均分布?答案很简单,我们只要在table里面加上一下代码就可以实现. table { width: 100%; table-layout: fixed; }

  2. BZOJ 2876 骑行川藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2876 拉格朗日乘数法:f'+入g'=0,f为函数的导数,g为限制条件的导数. 思路:E=Σki*si ...

  3. 感觉tbceditor很不错,如果作者能坚持下来,非常非常看好啊

    感觉tbceditor很不错,如果作者能坚持下来,非常非常看好啊 你技术好,可以做个自用的IDE慢慢加功能 ,很方便的用这个控件,写个支持Delphi和html混编的编辑器,要不到2个小时

  4. SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

    原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. ...

  5. Linux读取文件路径问题

    问题是这样的: 首先终端上有当前路径显示,我有个可执行程序代码是这样的: FILE fp  = fopen(filename, "rb"); if(fp == NULL)     ...

  6. Android之自定义checkbox样式

    大部分情况下,我们在UI中并不采用Android自带的checkbox复选框样式,这时候就需要我们自定义自己的checkbox. 首先找两张checkbox背景图片,比如下图样子的: 然后在drawa ...

  7. Eclipse IDE for Java EE Developers使用和新建工程helloworld

    开发j2ee还是用专门的java ee eclipse,自带了许多开发j2ee的插件,包括: This package includes: Data Tools Platform Eclipse Gi ...

  8. 在非MFC的win 32程序里面能够使用CString类

    论坛有会员用到了.,今天给大家说说CSring如何在非mfc下的调用第一:先要包含 #include "afx.h" 包含之后会报windows.h重复定义我们需要把这个头文件包含 ...

  9. svn add后的数据如何取消-svn revert??--zz

    svn add后的数据如何取消-svn revert?? 有时候你发现svn add后,这个提交的数据又不需要了.这时候需要有svn revert来处理了. 原文链接:http://hi.baidu. ...

  10. HDU1506(单调栈或者DP) 分类: 数据结构 2015-07-07 23:23 2人阅读 评论(0) 收藏

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...