简介
Ruby的标准图形用户界面(GUI)是Tk. Tk最初是作为John Ousterhout开发的Tcl脚本语言的GUI.
Tk具有唯一的区别,是唯一的跨平台GUI. Tk在Windows,Mac和Linux上运行,并在每个操作系统上提供原生外观.
基于Tk的应用程序的基本组件称为小部件.组件有时也称为窗口,因为在Tk中,"窗口"和"窗口小部件"通常可以互换使用.
Tk应用程序遵循窗口小部件层次结构,其中任意数量的窗口小部件可能是放在另一个小部件中,以及另一个小部件中的那些小部件,无限制地. Tk程序中的主要窗口小部件称为根窗口小部件,可以通过创建TkRoot类的新实例来创建.
大多数基于Tk的应用程序遵循相同的循环:创建小部件,将它们放在界面中,最后,将与每个小部件关联的事件绑定到方法.
有三个几何管理器; place,grid 和 pack ,负责控制界面中每个小部件的大小和位置.
安装
Ruby Tk绑定随Ruby一起发布,但Tk是一个单独的安装. Windows用户可以从 ActiveState的ActiveTcl 下载单击Tk安装.
Mac和Linux用户可能不需要安装它,因为它很可能已经与操作系统一起安装但如果没有,您可以下载预构建的软件包或从 Tcl Developer Xchange .
Simple Tk Application
Ruby/Tk程序的典型结构是创建main或 root 窗口(TkRoot的一个实例),向其添加小部件以构建用户界面,然后启动主事件循环通过调用 Tk.mainloop .
Ruby/Tk的传统 Hello,World!示例看起来像这样 :
require 'tk'root = TkRoot.new { title "Hello, World!" }TkLabel.new(root) do text 'Hello, World!' pack { padx 15 ; pady 15; side 'left' }endTk.mainloop
这里,在加载tk扩展模块后,我们创建了一个根级别使用 TkRoot.new 的帧.然后,我们将 TkLabel 小部件作为根框架的子框架,为标签设置多个选项.最后,我们打包根框并进入主GUI事件循环.
如果你要运行这个脚本,它会产生以下结果 :
Ruby/Tk Widget类
有一个各种Ruby/Tk类的列表,可用于使用Ruby/Tk创建所需的GUI.
TkFrame 创建和操作框架小部件.
TkButton 创建和操作按钮小部件.
TkLabel 创建和操作标签小部件.
TnEntry 创建和操作条目小部件.
TkCheckButton 创建和操作checkbutton小部件.
TkRadioButton 创建和操作radiobutton小部件.
TkListbox 创建和操作列表框小部件.
TkComboBox 创建和操作列表框小部件.
TkMenu 创建和操作菜单小部件.
TkMenubutton 创建和操作menubutton小部件.
Tk.messageBox 创建和操作消息对话框.
TkScrollbar 创建和操作ulate滚动条小部件.
TkCanvas 创建和操作画布小部件.
TkScale 创建和操作缩放小部件.
TkText 创建和操作文本小部件.
TkToplevel 创建和操作顶级小部件.
TkSpinbox 创建和操作Spinbox小部件.
TkProgressBar 创建和操作进度条小部件.
对话框创建和操作对话框小部件.
Tk :: Tile :: Notebook 用笔记本比喻在有限的空间内显示几个窗口.
Tk :: Tile :: Paned 显示多个子窗口,垂直或水平堆叠.
Tk :: Tile :: Separator 显示水平或垂直分隔条.
Ruby/Tk字体,颜色和图像了解Ruby/Tk字体,颜色和图像
标准配置选项
所有小部件都有许多不同的配置选项,通常控制它们的显示方式或行为方式.可用的选项当然取决于widget类.
这是所有标准配置选项的列表,可以适用于任何Ruby/Tk小部件.
Sr.No. | 选项&说明 |
---|---|
1 | activebackground => String 指定绘制活动元素时使用的背景颜色.如果鼠标光标位于元素上并且按下鼠标按钮将导致某些操作发生,则元素处于活动状态.您可以使用"红色","蓝色","粉红色","黄色"等颜色名称. |
2 | activeborderwidth =>Integer 指定一个非负值,表示在活动元素周围绘制的三维边框的宽度. |
3 | activeforeground => String 指定绘制活动元素时使用的前景色. |
4 | anchor => String 指定窗口小部件中信息(例如文本或位图)的显示方式.必须是其中一个值 n , ne , e , se , s , sw , w , nw 或中心.例如, nw 表示显示信息,使其左上角位于小部件的左上角. |
5 | background or bg =>String 指定显示窗口小部件时使用的正常背景颜色. |
6 | bitmap =>bitmap 指定要在窗口小部件中显示的位图.显示位图的确切方式可能会受到其他选项的影响,例如锚点或对齐. |
7 | borderwidth or bd =>Integer 指定一个非负值,指示要在小部件外部绘制的三维边框的宽度. |
8 | compound =>String 指定窗口小部件是否应同时显示文本和位图/图像,如果是,则应相对于文本放置位图/图像的位置.必须是其中一个值无,底部,顶部,左,右 ,或中心. |
9 | cursor => String 指定要用于窗口小部件的鼠标光标.可能的值可以是"观察","箭头"等. |
10 | disabledforeground =>String 指定绘制禁用元素时使用的前景色. |
11 | exportselection => Boolean 指定窗口小部件中的选择是否也应该是X选择.该值可以包含任何 true , false , 0 , 1 ,是,或否.如果导出选择,则在窗口小部件中选择取消选择当前的X选择,在窗口小部件外部选择取消选择任何窗口小部件选择,窗口小部件将在选择时响应选择检索请求. |
12 | font => String 指定在窗口小部件中绘制文本时使用的字体. |
13 | foreground or fg => String 指定显示窗口小部件时使用的正常前景色. |
14 | highlightbackground =>String 指定当窗口小部件没有输入焦点时在遍历突出显示区域中显示的颜色. |
15 | highlightcolor =>String 指定用于在窗口小部件具有输入焦点时围绕窗口小部件绘制的遍历高亮矩形的颜色. |
16 | highlightthickness =>Integer 指定一个非负值,指示当窗口小部件具有输入焦点时要在窗口小部件外部绘制的高亮矩形的宽度. |
17 | image => Image 指定要在窗口小部件中显示的图像,该图像必须是使用图像创建创建的.通常,如果指定了image选项,则它将覆盖指定要在窗口小部件中显示的位图或文本值的其他选项;图像选项可以重置为空字符串以重新启用位图或文本显示. |
18 | jump => String 对于具有可以拖动以调整值的滑块的小部件,例如滚动条和缩放,此选项可确定何时发出有关值更改的通知.选项的值必须是布尔值.如果值为false,则在拖动滑块时连续进行更新.如果值为true,则更新将延迟,直到释放鼠标按钮以结束拖动;此时会发出一个通知. |
19 | justify => String 当窗口小部件中显示多行文本时,此选项确定行之间的排列方式.必须是左,中心或右之一. 左表示行的左边都排成一行,居中表示行的中心对齐,右表示行'右边缘排列. |
20 | offset => String 指定图块的偏移量(另请参阅图块选项).它可以有两种不同的格式偏移x,y 或偏移侧,其中side可以 n , ne , e , se , s , sw , w , nw ,或中心. |
21 | orient => String 对于可以使用水平或垂直方向(例如滚动条)进行布局的窗口小部件,此选项指定应使用哪个方向.必须是水平或垂直或其中一个的缩写. |
22 | padx =>Integer 指定一个非负值,表示在X方向上请求窗口小部件的额外空间. |
23 | pady =>Integer 指定一个非负值,表示在Y方向上为窗口小部件请求多少额外空间. |
24 | relief => Integer 指定小部件所需的三维效果.可接受的值凸起,凹陷,平面,脊和凹槽. |
25 | repeatdelay =>Integer 指定按钮或键在开始自动重复之前必须按住的毫秒数.例如,用于滚动条中的向上和向下箭头. |
26 | repeatinterval =>Integer 与 repeatdelay 结合使用:一旦自动重复开始,此选项确定自动重复之间的毫秒数 |
27 | selectbackground =>字符串 指定显示所选项目时使用的背景颜色. |
28 | selectborderwidth =>Integer 指定一个非负值,表示在所选项目周围绘制的三维边框的宽度. |
29 | selectbackground => String 指定显示所选项目时使用的前景色. |
30 | setgrid => Boolean 指定一个布尔值,用于确定此窗口小部件是否控制其顶级窗口的调整大小网格.此选项通常用于文本小部件,其中小部件中的信息具有自然大小(字符的大小),并且窗口的维度是这些单元的整数是有意义的. |
31 | takefocus => Integer 提供通过键盘遍历(例如Tab和Shift-Tab)将焦点从窗口移动到窗口时使用的信息.在将焦点设置到窗口之前,遍历脚本首先检查窗口是否可见(它及其所有祖先都被映射);如果没有,则跳过窗口.值为0表示在键盘遍历期间应该完全跳过此窗口. 1表示此窗口应始终接收输入焦点. |
32 | text => String 指定要在窗口小部件中显示的字符串.显示字符串的方式取决于特定的小部件,可以通过其他选项确定,例如锚或对齐. |
33 | textvariable => Variable 指定变量的名称.变量的值是要在窗口小部件内显示的文本字符串;如果变量值发生变化,则窗口小部件将自动更新以反映新值.字符串在窗口小部件中的显示方式取决于特定窗口小部件,可以通过其他选项确定,例如锚点或对齐. |
34 | tile => Image 指定用于显示窗口小部件的图像.如果image是空字符串,则显示正常的背景颜色. |
35 | troughcolor => String 指定用于窗口小部件(如滚动条和刻度)中矩形槽区域的颜色. |
36 | troughtile =>Image 指定用于在窗口小部件(如滚动条和刻度)的矩形槽区域中显示的图像. |
37 | underline => Integer 指定要在窗口小部件中加下划线的字符的整数索引.默认绑定使用此选项来实现菜单按钮和菜单项的键盘遍历. 0对应于窗口小部件中显示的文本的第一个字符,1对应于下一个字符,依此类推. |
38 | wraplength =>Integer 对于可以执行自动换行的小部件,此选项指定最大行长度. |
39 | xscrollcommand =>function 指定用于与水平滚动条通信的回调. |
40 | yscrollcommand =>function 指定用于与垂直滚动条通信的回调. |
Ruby/Tk几何管理
几何管理处理根据要求定位不同的小部件. Tk中的几何管理依赖于主和从小部件的概念.
主服务器是一个小部件,通常是顶级窗口或框架,它将包含其他小部件,这些小部件被调用奴隶.您可以将几何管理器视为控制主窗口小部件,并决定将在其中显示的内容.
几何管理器将询问每个从属窗口小部件的自然大小或大小理想情况下,它会被展示出来.然后它会获取该信息并将其与程序提供的任何参数相结合,当它要求几何管理器管理该特定的从属窗口小部件时.
有三个几何管理器放置,网格和 pack ,负责控制界面中每个小部件的大小和位置.
网格在网格中排列小部件的几何管理器.
打包包装腔边缘的几何管理器.
放置几何管理器,用于固定或橡胶板放置.
Ruby/Tk事件处理
Ruby/Tk支持事件循环,它接收来自操作系统的事件.这些是按钮按下,按键,鼠标移动,窗口大小调整等等.
Ruby/Tk负责管理这个事件循环.它将确定事件应用于哪个小部件(用户是否单击此按钮?如果按下了某个键,哪个文本框具有焦点?),并相应地调度它.单个小部件知道如何响应事件,例如,当鼠标移动时,按钮可能会改变颜色,当鼠标离开时,按钮可以恢复.
在更高级别,Ruby/Tk在程序中调用回调来指示窗口小部件发生了重大事件.对于这两种情况,您都可以提供代码块或 Ruby Proc 对象,该对象指定应用程序如何响应事件或回调./p>
让我们看一下如何使用bind方法将基本窗口系统事件与处理它们的Ruby过程相关联.最简单的bind形式的输入是一个表示事件名称的字符串和Tk用来处理事件的代码块.
例如,捕获 ButtonRelease 某些小部件上第一个鼠标按钮的事件,你要写 :
someWidget.bind('ButtonRelease-1') { ....code block to handle this event...}
事件名称可以包含其他修饰符和详细信息.修饰符是一个字符串,如 Shift , Control 或 Alt ,表示已按下其中一个修饰键.
因此,例如,捕获用户按住 Ctrl 键并单击鼠标右键时生成的事件.
someWidget.bind('Control-ButtonPress-3', proc { puts "Ouch!" })
许多Ruby/当用户激活它们时,Tk小部件可以触发回调,并且您可以使用命令回调来指定在发生这种情况时调用某个代码块或过程.如前所述,您可以在创建窗口小部件时指定命令回调过程 :
helpButton = TkButton.new(buttonFrame) { text "Help" command proc { showHelp }}
或者您可以稍后使用小部件的
helpButton.command proc { showHelp }
由于命令方法接受过程或代码块,您也可以将前面的代码示例写为 :
helpButton = TkButton.new(buttonFrame) { text "Help" command { showHelp }}
Sr.No. | Tag&事件描述 |
---|---|
1 | "1"(一) 点击鼠标左键. |
2 | "ButtonPress-1" 单击鼠标左键. |
3 | "Enter" 将鼠标移到里面. |
4 | "Leave" 将鼠标移到外面. |
5 | "Double-1" 双击. |
6 | "B3-Motion" 右键从一个位置拖动到另一个位置. |
7 | Control-ButtonPress-3 按下右键和 Ctrl Key. |
8 | Alt-ButtonPress-1 让按钮与 Alt 键一起按下. |
配置方法
configure 方法可用于设置和检索任何窗口小部件配置值.例如,要更改按钮的宽度,您可以随时调用configure方法,如下所示 :
require "tk"button = TkButton.new { text 'Hello World!' pack}button.configure('activebackground', 'blue')Tk.mainloop
要获取当前小部件的值,只需提供没有值的内容,如下所示;
color = button.configure('activebackground')
你也可以在没有任何选项的情况下调用configure,这将为您提供所有选项及其值的列表.
cget方法
为了简单地检索选项的值,configure返回更多信息比你通常想要的. cget方法只返回当前值.
color = button.cget('activebackground')