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. YY语音从4.0版本开始是基于Qt的开发过程,以及碰到的问题

    作者:姚冬链接:http://www.zhihu.com/question/21359230/answer/20127715来源:知乎著作权归作者所有,转载请联系作者获得授权. YY语音从4.0版本开 ...

  2. HTML常用字符

    显示结果 描述 实体名称 实体编号   空格     < 小于号 < < > 大于号 > > & 和号 & & " 引号 &quo ...

  3. 是否需要手动执行DataContext的Dispose方法?

    我们知道DataContext实现了IDisposable接口.在C#中,凡是实现了IDisposable接口的类,都推荐的使用using语句.如下: using (DataContext db = ...

  4. Triangle 解答

    Question Given a triangle, find the minimum path sum from top to bottom. Each step you may move to a ...

  5. TCP/IP协议详解概述

    TCP/IP协议详解卷1--第一章概述--读书笔记 作者:vpoet 日期:2015/06/25 注:本系列的文章只是作者对TCP/IP协议的理解,难免会出现纰漏或者不完整,当然也有可能很肤浅,希望大 ...

  6. 【LeetCode练习题】Pow(x, n)

    Pow(x, n) Implement pow(x, n). 计算x的n次方. 解题思路: 考虑到n的值会很大,而且可为正可为负可为0,所以掉渣天的方法就是用递归了. 对了,这题也在<剑指off ...

  7. linux多线程socket编程一些心得

    http://hi.baidu.com/netpet/blog/item/2cc79216d9012b54f2de32b9.html 前段时间将新的web模型办到linux上来,用epoll代替了IO ...

  8. tomcat建立虚拟主机

    WEB浏览器与WEBserver建立连接后,除了将请求URL中的资源路径发送给WEBserver外,还会将URL中的主机名部分作为HTTP请求消息的Host头发送给WEBserver.比如,在浏览器地 ...

  9. paip.c++ qt 目录遍历以及文件操作

    paip.c++ qt 目录遍历以及文件操作 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/a ...

  10. 大话NoSql

    之前看过一本名叫<<大数据挑战的书>>.里面主要讲了NOSQL的内容,感觉讲得确实不错,今天来又一次温习一下,我们大话NOSQL.说道NOSQL.我们肯定联想到的内容就是Big ...