0530-3433334

网站建设 APP开发 小程序

知识

分享你我感悟

您当前位置>首页 >> 知识 >> 软件开发

/Tk的编程项目,让你开始学习

发表时间:2023-10-26 06:03:11

文章来源:炫佑科技

浏览次数:195

菏泽炫佑科技

/Tk的编程项目,让你开始学习

以下是一个简单的编程项目,可以帮助您开始学习 Tcl/Tk。

探索 Tcl/Tk 的基本构造,包括用户输入、输出、变量、条件评估、简单函数和基本事件驱动编程。

我写这篇文章是因为我想更深入地利用基于 Tcl 的编程。 这促使我写了以下两篇文章:《通过编写一个简单的游戏来学习 Tcl》和《通过编写一个简单的游戏来学习》。

做了一些自动化工作,逐渐积累了一些本地脚本。 我经常使用一些脚本,以至于以下循环变得有点烦人:

我每天都使用 macOS。 其实我更希望有一个菜单项或者一个图标,可以弹出一个简单的界面来接受参数并执行我需要的操作,就像Linux中的KDE一样。

经典的 Tcl 书籍包含流行的 Tk 扩展的文档。 现在我已经深入研究了这个主题,我正在尝试对其进行编程(即希望)。

尽管我不是 GUI 或前端开发人员,但我发现 Tcl/Tk 脚本相当简单且易于理解。 我很高兴能够重新审视 UNIX 历史中这一古老而稳定的部分,这项技术在现代平台上仍然具有相关性并可用。

安装 Tcl/Tk

对于Linux系统,可以按如下方式安装:

$ sudo dnf install tcl
$ which wish
/bin/wish

在 macOS 上,您可以通过以下方式安装*新版本的 Tcl/Tk:

$ brew install tcl-tk
$ which wish
/usr/local/bin/wish

编程概念

许多编写游戏的教程都会介绍典型的编程语言结构,例如循环、条件、变量、函数、过程等。

在这篇文章中,我想介绍事件驱动编程。 当您的程序使用事件驱动编程时,它会进入一个特殊的内置循环,等待特定事件的发生。 当这个特定事件发生时,相应的代码被触发,产生预期的结果。

这些事件可以包括键盘输入、鼠标移动、按钮单击、计时器触发器,甚至计算机硬件识别的任何事件(可能来自特殊设备)。 你程序中的代码决定了用户看到什么、程序需要监听什么输入、程序收到这些输入时做什么,然后进入事件循环等待输入。

这篇文章的概念与我之前的 Tcl 文章相去不远。 这里*大的区别是将循环结构替换为 GUI 设置和用于处理用户输入的事件循环。 其他差异在于 GUI 开发制作可用用户界面所采用的各种方法。 使用 Tk GUI 进行开发时,您需要了解两个基本概念:组件和几何管理器。

小部件是构成视觉元素的 UI 元素,用户可以通过这些视觉元素与程序进行交互。 这包括按钮、文本区域、标签和文本输入框。 小部件还包括一些选项选择,例如菜单、复选框、单选按钮等。*后,小部件还包括其他视觉元素,例如边框和线性分隔符。

几何管理器在将组件放置在显示窗口中起着至关重要的作用。 您可以使用几种不同的几何管理器。 在本文中,我主要使用网格几何形状将组件排列整齐。 我将在本文末尾解释几何管理器之间的一些差异。

使用愿望猜数字游戏

这个示例游戏代码与我其他文章中的示例不同,为了更容易解释,我将其分解为多个部分。

首先创建一个基本的可执行脚本.wish:

$ touch numgame.wish
$ chmod 755 numgame.wish

使用您喜欢的文本编辑器打开此文件并输入以下代码的**部分:

#!/usr/bin/env wish
set LOW 1
set HIGH 100
set STATUS ""
set GUESS ""
set num [expr round(rand()*100)]

**行定义脚本将通过 Wish 执行。 接下来,创建几个全局变量。 在这里,我使用全部大写来定义全局变量,这些变量将绑定到跟踪这些值(低、高等)的小部件。

全局变量num是游戏玩家想要猜测的随机值。 该值通过Tcl命令执行获得并保存到变量中:

proc Validate {var} {
    if { [string is integer $var] } {
        return 1
    }
    return 0
}

这是一个验证用户输入的特殊函数,它只接受整数并拒绝所有其他类型的输入:

proc check_guess {guess num} {
    global STATUS LOW HIGH GUESS
    if { $guess  $HIGH } {
        set STATUS "Huh?"
    } elseif { $guess  $num } {
        set STATUS "Too high!"
        set HIGH $guess
    } else {
        set LOW $guess
        set HIGH $guess
        set STATUS "That's Right!"
        destroy .guess .entry
        bind all 

这是主要的猜测逻辑循环。 语句允许我们修改在文件开头创建的全局变量(稍后将详细介绍该主题)。 此条件检查查找超出 1 到 100 范围且已被用户猜测的值。 将有效猜测与随机值进行比较。 低和高猜测被跟踪并报告为 UI 中的全局变量。 在每一步中,全局变量都会更新自动化软件开发,并且此状态信息会自动显示在 UI 中。

为了正确猜测,该语句删除了“猜测”按钮和输入窗口,并重新绑定 Enter 键以激活“退出”按钮。

*后的语句 set GUESS "" 在下一次猜测之前清除输入窗口。

label .inst -text "Enter a number between: "
label .low -textvariable LOW
label .dash -text "-"
label .high -textvariable HIGH
label .status -text "Status:"
label .result -textvariable STATUS
button .guess -text "Guess" -command { check_guess $GUESS $num }
entry .entry -width 3 -relief sunken -bd 2 -textvariable GUESS -validate all \
    -validatecommand { Validate %P }
focus .entry
button .quit -text "Quit" -command { exit }
bind all 

这是设置用户界面的部分。 前六个标签语句在 UI 上创建不同的文本显示元素。 - 选项监视给定的变量并自动更新标签的值。 这显示了全局变量 LOW、HIGH 等的绑定。

行创建“猜测”和“退出”按钮,-选项指定按下按钮时要执行的操作。 按“猜测”按钮执行上述功能以检查用户输入的值。

条目小部件更有趣。 它创建一个三字符宽的输入框并将输入绑定到 GUESS 全局变量。 它还通过 - 选项设置验证,防止输入小部件接收除数字之外的任何内容。

focus 命令是一项用户界面改进,可在程序启动时使输入小部件处于活动状态。 如果没有这个命令,则需要点击输入组件才可以输入。

绑定命令允许您在按 Enter 键时自动单击“猜测”按钮。 如果你记得其中的内容,猜对了就会将 Enter 键重新绑定到“退出”按钮。

*后,本节设置 GUI 的布局:

grid .inst
grid .low .dash .high
grid .status .result
grid .guess .entry
grid .quit

网格几何管理器被增量调用以逐渐构建所需的用户体验。 它主要设置了五个元素组件。 前三行是显示不同值的标签,第四行是“猜测”按钮和输入小部件,*后一行是“退出”按钮。

此时程序已经初始化并进入事件循环,等待用户输入整数并按下按钮。 根据它在正在监视的全局变量中发现的更改,它会更新标签。

请注意,输入光标在输入框中开始,按 Enter 键将调用适当且可用的按钮。

这只是一个基本的示例,Tcl/Tk 有许多选项可以使间距、字体、颜色和其他用户界面方面比本文中的简单 UI 示例更具吸引力。

运行该应用程序,您可能会注意到这些部件看起来不太精致或现代。 这是因为我使用的是一套原始的经典部件,可以追溯到 X Motif 时代。 但是,有一些默认的小部件扩展(称为主题小部件)可以为您的应用程序提供更现代、更复杂的外观和感觉。

开始游戏!

保存文件后,在终端中运行它:

$ ./numgame.wish

在这种情况下,我无法给出控制台输出,所以这里有一个动画 GIF 展示了如何玩游戏:

自动化软件开发_软件自动开发环境_软件自主开发

了解有关 Tcl 的更多信息

Tcl 支持命名空间的概念,因此这里使用的变量不必是全局的。 您可以将绑定的小部件变量组织到不同的命名空间中。 对于像这样的简单程序,这可能没有必要。 但对于较大的项目,您可能会考虑这种方法。

proc函数体内有一行代码我之前没有解释过。 在Tcl中,所有变量都是按值传递的,并且函数体内引用的变量的范围是局部的。 在这种情况下,我希望修改全局变量,而不是本地范围的版本。 Tcl 提供了许多方法来引用变量以在执行堆栈中执行更高级别的代码。 在某些情况下,像这样的简单引用可能会引入一些复杂性和错误,但是调用堆栈的操作非常强大,允许 Tcl 实现新的条件和循环结构,而在其他语言中实现这些结构可能会更复杂。

*后,在本文中我没有提到几何管理器,它用于以特定顺序呈现零件。 只有由某些几何管理器管理的零件才能显示在屏幕上。 网格管理器非常简单,从左到右放置小部件。 我使用了五个网格定义来创建五行。 还有两个几何管理器:放置和打包。 包管理器将小部件排列在窗口的边缘周围,而位置管理器允许固定小部件的位置。 除了这些几何管理器之外,还有一些特殊的组件,例如文本和 ,它们可以容纳和管理其他组件。 您可以在经典 Tcl/Tk 参考指南和 Tk 命令文档页面上找到这些组件的全面描述。

继续学习编程

Tcl 和 Tk 提供了一种简单而有效的方法来构建图形用户界面和事件驱动的应用程序。 这个简单的猜谜游戏只是您可以使用这些工具执行的操作的起点。 通过继续学习和探索 Tcl 和 Tk/Tk的编程项目,让你开始学习,您可以为构建功能强大且用户友好的应用程序开辟无数可能性。 不断尝试,不断学习,看看您新发现的 Tcl 和 Tk 技能将带您走向何方。

(标题:MJ/-6577-4033-9f3c-)

通过:

作者:James 选题:lkxed 译者:校对:wxy

本文由 LCTT 原创编译,Linux China 自豪推出

炫佑科技专注互联网开发小程序开发-app开发-软件开发-网站制作等

相关案例查看更多