2023年9月

无人注意,新安装的 Ubuntu 23.04 不支持安装 32 位应用

有用户报告,在新安装的 Ubuntu 23.04 上从 Ubuntu 仓库安装的 Steam 客户端是不工作的。在 Ubuntu 23.04 中使用了基于 Flutter 的新安装程序,它在后台使用了 Subiquity,默认情况下并不支持 32 位库。结果就是,尽管 Ubuntu 23.04 用户可以运行 apt 命令或点击软件中心的安装按钮来安装,但由于 Steam 所依赖的 32 位库无法被调入,因此,对大多数用户来说 Steam 无法正常运行。问题是,4 月份发布的 Ubuntu 23.04 现在才被发现这个问题。原因可能是,一方面大部分用户是从之前版本升级而来,带有 32 位库支持,也有很多人是直接从 Valve 下载了带有 32 位支持的 Linux 版 Steam;另外一方面,短期版的 Ubuntu 用户可能真不多。

消息来源:Omg Ubuntu
老王点评:Ubuntu 开发人员不可能也不应该发现所有问题,但是 Linux 桌面的用户群体,可能真的很少。

研究称 Linux 市场规模每年增长约 20%

根据一家研究机构的报告,2022 年,全球 Linux 操作系统市场规模为 62 亿美元,预计在预测期内将以 18.94% 的年复合增长率增长,到 2028 年将达到 170 亿美元。

消息来源:Benzinga
老王点评:结合上一条,Linux 整体的市场发展是很好,但 Linux 桌面可能会是一直的短板。

安卓 14 仍不能正确计算存储空间利用率

我们通常依靠安卓的存储利用率工具来查找占用存储空间的应用程序和文件,以便在需要时卸载或删除它们。然而有专家发现,谷歌对安卓系统组件占用空间的计算存在缺陷。安卓将系统存储空间计算为除了音频、视频、图片、文档、垃圾和游戏等之外的其他类别所占的空间。也就是说,安卓“系统”不仅仅包括安卓系统文件。

消息来源:Android Police
老王点评:只能说安卓开发人员偷懒了,他们认为就不应该有“偷偷”以其它未分类类别出现的文件。

回音

  • 在 Linus Torvalds 提出 批评 后,Bcachefs 首席开发者继续 表达 了他对 Linux 内核上游进程和开发者互动的不满,表示要休息一段时间。显然,Bcachefs 不会在 Linux 6.6 合并窗口关闭的最后一分钟提交新的拉取请求了。

Librum,这是一个全新的,配备云图书馆功能的电子书阅读器。

你是不是酷爱阅读?或者正在逐渐沦为书虫?

放心,我们为你准备了绝佳的解决方案!

Librum 阅读器,这是一个全新的电子阅读器产品,它打造的阅读环境 “能让每个人都发现阅读的乐趣,轻松愉快地阅读”。

尽管它并非你通常会使用的那种离线阅读器应用,但在 Linux 最佳电子阅读器 的榜单上,很可能是候选之一。因为有了 Librum,你可以 充分发挥云技术的优势,任何时候,无论使用哪个设备,都能随时访问个人图书馆。

下面,就让我来为你详细介绍一下。

Librum:概览 ⭐

Librum 基本上是通过 QMLC++ 构建的,这款 开源的电子书阅读器 允许你以直观的界面将内容同步到云端。

你可以免费开始使用,初次注册便有 2GB 的云存储空间。此外,一些尚未最终确定的高级套餐也即将推出。

? Librum 阅读器目前正在积极开发中,尚未发布稳定版。

Librum 还配有丰富的功能,其中一些突出之处包括:

  • 图书馆的个性化定制
  • 书籍的元数据编辑
  • 云同步
  • 现代化的界面

推荐阅读 ?

8 个 Linux 上的最佳电子书阅读器

初步体验 ?‍?

我首次尝试在我的 Ubuntu 22.04 系统上运行 Librum。但是,在我使用该应用之前,我 必须先创建一个账户,提供电子邮件地址和密码。

虽然 Librum 的主打功能是基于云的体验,但我 还是希望它能有一个专门的离线模式,可以让我在注册之前做一些试用,或者作为一种可选择的备用模式。

不过,我还是继续前进,并登录了这款应用。我使用 “ 添加书籍 Add books ” 功能导入了一些书籍,然后它们就在主页标签下被整齐地排列好,提供了对其排序、过滤或添加标签的选项。

电子书的阅读体验 几乎与你对现代阅读器应用的期待一致,拥有最简界面,还有放大文本、进入全屏模式等功能。

汉堡菜单的选项内含有一些基本功能。最上面三个选项可以让你打印、保存或分享当前打开的电子书。

此外的选项还包括:文本转语音功能连续/垂直显示页面反转颜色同步书籍,以及访问设置菜单

我也试用了一下 搜索功能:我可以快速地查找特定的词汇,并可以高亮显示所有结果、区分大小写或搜索整个单词。

目录功能 也相当方便使用,你可以使用搜索栏查找特定章节。

以上就是我使用 Librum 阅读器的电子书阅读体验。

但是等一下,这还没完,还有更多的东西等着你去发现!

未来计划的功能 ?

我注意到还有很多功能正在开发中。

其中一个是 一个在应用内部的免费书店计划将提供超过 70,000 本的电子书籍;另一个是 统计页面,将会显示 个人的阅读统计信息

最后一个是 插件页面,应该是提供 进一步增强 Librum 功能的插件

预计在接下来的几个月内会发布稳定版本。

开发者们还没有明确说明即将推出的付费计划具体会提供什么。我个人猜测可能会提供更多的云存储空间和接入更多新奇的功能。

我推荐你关注他们的 新闻页面,以便获取有关 Librum 阅读器的最新信息。

? 获取 Librum

目前,Librum 以 Flatpak 形式提供给 Linux 用户,并且还在为 WindowsmacOS 用户开发对应版本。

转到 官方网站Flathub 商店 就可以获取下载。

Librum (Flathub)

? 在 Linux 上,你最喜爱的电子书阅读器应用是哪个?在下方的评论框里留言分享你的观点吧。

(题图:MJ/9b52d578-ae83-4401-ae57-eb342d8bcfd6)


via: https://news.itsfoss.com/librum-reader/

作者:Sourav Rudra 选题:lujun9972 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux Lite 6.6 可能没有大的变化,但看起来它专注于有用的部分。

Linux Lite 是 最好的轻量级 Linux 发行版 之一,提供 类似 Windows 的体验。

我们上次了解它是在今年早些时候,当时 Linux Lite 6.4 添加了一些重大更改。现在,他们又发布了一个小版本,承诺进行大量改进。

? Linux Lite 6.6:有什么新变化?

该版本被称为 2012 年以来最大的 Linux Lite 版本之一,增加了数千行新代码。Linux Lite 6.6 由可靠的 Linux 内核 5.15 提供支持,是一个适度的更新。

一些亮点包括:

  • 改进了 Lite 欢迎应用
  • 免费 AI 聊天机器人
  • 支持新语言

改进的 Lite Welcome

“Lite Welcome” 应用已更新,当未安装 Linux Lite 时,在立付会话中显示 “ 立即安装 Install Now ” 按钮。现在它将检查它是否在立付环境中运行并相应地显示按钮。

这将是直接将 Linux Lite 安装到系统上的便捷方法。此次更新还为欢迎应用添加了另一个选项。下面有更多内容。

Free A.I. Chatbot

欢迎应用程序中的一个新链接可直接前往 Linux Lite 的网络聊天机器人,名为 “Free A.I. Chatbot”。

用户可以使用它来获得与 Linux Lite 相关的支持。尽管我希望这是系统中内置的专用应用,但拥有它仍然很有趣。

你还可以使用网络浏览器直接 访问 它。

支持新语言

这是上述代码行的主要部分,Linux Lite 6.6 中添加了对 22 种语言的支持。

我用“印地语”测试了它,效果很好。尽管某些选项仍然以英语显示,但很高兴看到它们试图更具包容性,提供更广泛的语言选项。

提供这些语言的区域包括主菜单、右键单击菜单、文件夹名称、Linux Lite 应用名称、桌面图标和“我的电脑”菜单名称。

?️ 其他更改和改进

其余的变化包括新壁纸和应用更新。其中一些是:

  • Chrome 116
  • VLC 3.0.16
  • Gimp 2.10.30
  • LibreOffice 7.5.6
  • Thunderbird 102.15
  • 新壁纸
  • 包含最新的 Papirus 图标主题。
  • 硬件数据库目前拥有超过 85,000 条提交内容。

有关这些变化的更详细的展望,请访问其 公告

? 下载 Linux Lite 6.6

你可以前往 官方网站 获取此版本或单击下面的按钮。

Linux Lite 6.6

? 你对 Linux Lite 6.6 版本有何看法?


via: https://news.itsfoss.com/linux-lite-6-6-release/

作者:Sourav Rudra 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

微软称将保护客户免受 AI 版权诉讼

微软公司的法律事务总顾问表示,只要客户使用了他们在产品中内置的防护栏和内容过滤器,《微软 Copilot 版权承诺》将为客户提供保护。微软还承诺支付相关罚款或和解金,并表示已采取措施确保其 Copilot 尊重版权。他说,“我们向商业客户收取 Copilot 的费用,如果他们的使用产生了法律问题,我们应该把这个问题变成我们自己的问题,而不是客户的问题。”

消息来源:彭博社
老王点评:这是应有之义,为客户使用 AI 提供了信心。

Bcachefs 合并再生波折

在冲击 Linux 6.5 失败后,Bcachefs 再次向 Linux 6.6 发起了合并请求。但 Linus Torvalds 突然发现,不但 Bcachefs 的拉取请求没有使用带有 PGP 密钥和信任链的签名 Git 标签,更严重的是,它没有先进入 linux-next 树。这个事情让 Linus 感到烦恼,并警告 Bcachefs 不要“无视所有基本规则”,“如果你真的想把它合并到上游,就必须与上游合作。” Linus 说,“这一点不容讨价还价”,否则就“继续在主内核树之外做十年的开发工作吧”。并且,Linus 还发现 Bcachefs 会出现编译器错误,这本来应该通过 linux-next 的审核更容易地发现。

消息来源:Phoronix
老王点评:Linus 本来是乐于看到 Bcachefs 进入内核的,但是现在看起来“不守规矩”的 Bcachefs 很难在这个窗口进入 Linux 6.6 了。

Ubuntu 新增 TPM 支持的全磁盘加密功能

尽管没有集成可信平台模块(TPM),Ubuntu 多年来一直提供全磁盘加密支持。下个月发布的 Ubuntu 23.10 将实验性地引入对基于 TPM 的全磁盘加密的初步支持。但这个实验性的功能依赖于备受争议的 Snap 打包格式,引导加载器和内核将作为 Snap 包交付,而不是作为 Debian 包交付。并且,Ubuntu 还将使用统一内核镜像(UKI),将内核和 initramfs 封装在一个 PE 二进制文件中。

消息来源:Phoronix
老王点评:我既不喜欢 TPM,也不喜欢 Snap,更不喜欢统一内核镜像。真是难得集齐了。

我们能否在 Arch Linux 中通过主流的桌面环境或窗口管理器来全面运行 Wayland?一起来探索答案。

Wayland 是一种针对 Linux 运行图形应用的高效、现代化的协议。相较之下,它在安全、稳定和图形性能方面相较老旧的 X.Org 显示服务器表现更出色。

尽管 X.Org 多年来一直是默认的显示服务器,但其年代漫长且复杂度高,导致了许多问题,包括安全漏洞和对新型硬件的兼容性问题。而 Wayland 提供了一个更简洁和安全的显示协议,用以解决这些问题。

虽然向 Wayland 转型已经有近十年的时间,但这是可以理解的。大型 Linux 发行版,例如 Ubuntu 和 Fedora,自 2021 年起就默认使用 Wayland,因为该协议现已逐渐稳定。

然而,对 Arch Linux 用户来说,使用 Wayland 进行自定义安装可能会比较复杂。在所有主流桌面环境中,只有 KDE Plasma 和 GNOME 有最新的 Wayland 支持。Xfce、LXQt 及其他桌面环境正在开发支持 Wayland 的功能,但现在还没有做好准备。

在窗口管理器方面,Sway 在 Arch Linux 中已经全面支持 Wayland。尽管如此,我还是希望能测试 Wayland 在 Arch 中的表现,并给你提供一个截至今日的状态报告。

让我们来尝试在 Arch Linux 中配置 KDE Plasma 和 GNOME 以全面支持 Wayland。

Arch Linux 中的 Wayland 设置

在理想的情况下,你应已经安装了 基础的 wayland 包。打开一个终端,并通过运行下列命令进行核实:

pacman -Qi wayland

如果你尚未安装,则可以使用以下命令进行安装:

sudo pacman -S --needed wayland

KDE Plasma 桌面环境

接下来的步骤设定的前提条件是你拥有一个没有安装任何桌面环境或窗口管理器的裸机 Arch Linux 环境。你可以通过使用 高效的 archinstall 脚本 进行 Arch Linux 的裸机安装。

在 Arch Linux 中,为了设置标准的 KDE Plasma,我们需要对 Wayland 进行一些调整。因此,该过程中需要从 AUR 安装一些包进来,这就要求你已经 设置了 Yay 或者其他的 AUR 辅助工具。

首先,利用以下命令从 AUR 安装一个定制的 sddm 显示管理器 Wayland 软件包。请注意,这个 sddm 包与 Arch Extra 仓库中的 sddm 包并不相同。根据 ArchWiki 的指南,只有 GDM 和 sddm-git 在 Arch Linux 中提供了完善的 Wayland 支持。

yay -S sddm-git

安装完成后,执行下述命令来安装更多 Wayland 包。

  • xorg-xwayland:使得 xclients 能在 Wayland 下运行
  • xorg-xlsclients:列出正在一个显示端口上运行的客户端应用(可选)
  • qt5-wayland:为 Wayland 提供的 Qt API
  • glfw-wayland:供 Wayland 使用的 GUI 应用开发包
pacman -S --needed xorg-xwayland xorg-xlsclients qt5-wayland glfw-wayland

然后,执行以下命令以安装 Plasma 和与 Wayland 会话关联的应用。请保持以下的安装顺序。

pacman -S --needed plasma kde-applications
pacman -S --needed plasma-wayland-session

注意:如果你是英伟达用户,你可能需要考虑安装 egl-wayland 包,但需要说明的是,我没有尝试过此操作。

我们现在来安装 Firefox 和 Chromium,这样能够帮助我们测试 Wayland 是否正常运行。

pacman -S --needed firefox chromium

安装完成后,启动 sddm 显示管理器和 NetworkManager 服务。

sudo systemctl enable sddm
sudo systemctl enable NetworkManager

另外,sddm 显示管理器需要做一些额外设置。使用你喜欢的文本编辑器,打开 sddm 的配置文件,然后在 [Theme] 下面添加 Current=breeze

sudo nano /usr/lib/sddm/sddm.conf.d/default.conf
[Theme]
# current theme name
Current=breeze

设置完成后,保存并关闭文件,然后进行重启。

reboot

重启后,在登录屏幕上,你应该可以看到 Wayland 的选项。选择并登录 KDE Plasma 的 Wayland 会话。

Plasma Wayland 会话登录界面

你还能通过查看 $XDG_SESSION_TYPE 变量来 核实你是否在运行 Wayland

Arch Linux 中运行的 KDE Plasma 与 Wayland

如果你希望强制让 Firefox 以 Wayland 运行,那么就在 /etc/environment 中添加以下行。

MOZ_ENABLE_WAYLAND=1

然后重新启动或执行下方的命令使其生效。

source /etc/environment

打开 Firefox,进入 about:support 页面来校验 “Window protocol” 的值。你也可以通过在终端中运行 xlsclients 来查看哪些外部应用正在运行在 Wayland 下。

在 Arch 和 KDE Plasma 下 Firefox 使用的是 xwayland

至此,你已经完成了在 Arch Linux 中使用 Wayland 安装配置 KDE Plasma 的全部步骤。

Wayland KDE Plasma 在 Arch 中的性能表现

总体而言,Arch Linux 下的 KDE Plasma 配合 Wayland 运行得相当顺畅,未出现任何中断使用或重大问题的情形。截图和屏幕录制应用 Spectacle 功能一切正常。尽管如此,我在测试过程中还是注意到了几个小问题。

首先,在开启如 Dolphin 这类应用程序时,底部面板时不时会出现闪烁,这主要是在 VirtualBox 会话中观察到的。

其次,鼠标指针的变化行为有点奇怪。它无法适時地从指针状态切换到操作手柄状态(详见下图)。

最后,当从待机/屏幕关闭状态恢复在线时(在没有安装客户机插件的 VirtualBox 中),KWin 会崩溃。虽然这可能只是虚拟机特有的现象,但仍然需要进行硬重启才能返回到桌面。

在 Arch Linux 的 Wayland 会话闲置状态下,内存消耗大约为 2GB。

GNOME

在 Arch Linux 中,GDM 显示管理器已经完全支持 Wayland。首先,我们通过下列命令安装 GDM:

pacman -S --needed gdm

安装完毕后,使用以下命令安装几个 Wayland 需要的包。

  • xorg-xwayland:使得 xclients 能在 Wayland 下运行
  • xorg-xlsclients:用于列出在显示器上运行的应用程序(可选)
  • glfw-wayland:Wayland 的图形用户界面应用开发包
pacman -S --needed xorg-xwayland xorg-xlsclients glfw-wayland

接下来,你可以用下面的一系列命令来安装 GNOME 和一些与 Wayland 会话相关的应用。请确保按照下列给出的顺序来执行这些命令。

sudo pacman -S --needed gnome gnome-tweaks nautilus-sendto gnome-nettool gnome-usage gnome-multi-writer adwaita-icon-theme xdg-user-dirs-gtk fwupd arc-gtk-theme

注意:如果你正在使用英伟达,你可能需要安装 egl-wayland 软件包,但我并未亲自试过此方法。

接下来,我们还要安装 Firefox 和 Chromium,这样你就能测试 Wayland 是否在 GNOME 中正常运行。

pacman -S --needed firefox chromium

一旦这项任务完成,就启动 GDM 显示管理器和 NetworkManager 服务。

sudo systemctl enable gdm
sudo systemctl enable NetworkManager

保存并关闭文件之后,进行重启。

reboot

在登录界面,你能看到 “GNOME (Wayland)” 选项。选择并登录到 GNOME 的 Wayland 会话中,以进入 Arch Linux。

在 Arch Linux 中运行的带有 Wayland 的 GNOME

GNOME 的性能

如果将 GNOME 和 KDE Plasma 进行对比,你会发现 GNOME 在 Arch Linux 的 Wayland 下的表现更胜一筹。没有遇到重大问题或应用屏幕闪烁。这可能源于 GNOME 44 针对 Wayland 的最新改进已普及至 Arch Linux。

此外,Firefox 是在 GNOME 上直接在 Wayland 上运行,而不是使用 xwayland 包装器。

在 GNOME 中的 Firefox 使用 Wayland

解决常见 Wayland 问题

虽然 Wayland 提供了众多优点,但在使用过程中你可能会遇到一些挑战。以下列出了几个常见的问题以及可能的解决方案:

  • 处理不兼容的应用程序:部分较旧或不常用的应用可能还未完全支持 Wayland。你可以考虑寻找专为 Wayland 设计的替代应用,或利用 XWayland 作为兼容性层。
  • 解决性能相关问题:如果你在特定的应用程序中遇到性能问题,确保你已经安装了最新的图形驱动。另外,也可以查看是否有特定的合成器设置或适用于特定应用程序的优化措施。
  • 这个页面 中,也有更多疑难解答的建议。

结论

在 Arch Linux 中将 Wayland 设置为默认的显示服务器可以大大提升安全性、稳定性和图形性能。遵循本指南的安装和配置步骤,你能够从 Xorg 平稳过渡到 Wayland,享受一个更为现代高效的显示体验。

然而,对于 Arch Linux 加 Wayland 的组合来说,整个过程可能会显得稍微复杂一些,因为许多问题崩溃时都需要额外的注意。

这个指南并没包括在 Arch 使用 Wayland 游戏的测试,所以你可能需要在配置完成后自行试验。我希望这篇教程能帮助你在 Arch Linux 中配置 Wayland。

如果你有任何进展,欢迎在下面的评论框中告诉我。

(题图:MJ/188e0c86-ed52-4185-b583-23814fb72ce7)


via: https://www.debugpoint.com/wayland-arch-linux/

作者:Arindam 选题:lkxed 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

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

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

我写这篇文章的初衷源于我想更深入地利用基于 Tcl 的 Expect。这让我写下了以下两篇文章:通过编写一个简单的游戏学习 Tcl通过编写一个简单的游戏学习 Expect

我进行了一些 Ansible 自动化工作,逐渐积累了一些本地脚本。有些脚本我频繁使用,以至于以下循环操作变得有些烦人:

  • 打开终端
  • 使用 cd 命令跳转至合适的目录
  • 输入一条带有若干选项的长命令启动所需的自动化流程

我日常使用的是 macOS。实际上我更希望有一个菜单项或者一个图标,能够弹出一个简单的界面接受参数并执行我需要的操作,这就像在 Linux 的 KDE 中一样

经典的 Tcl 类书籍都包含了关于流行的 Tk 扩展的文档。既然我已经深入研究了这个主题,我尝试着对其(即 wish)进行编程。

虽然我并非一名 GUI 或者前端开发者,但我发现 Tcl/Tk 脚本编写的方式相当直接易懂。我很高兴能重新审视这个 UNIX 历史的古老且稳定的部分,这种技术在现代平台上依然有用且可用。

安装 Tcl/Tk

对于 Linux 系统,你可以按照下面的方式安装:

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

而在 macOS 上,你可以通过 Homebrew 来安装最新版的 Tcl/Tk:

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

编程理念

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

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

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

这篇文章的理念并没有脱离我之前的 Tcl 文章太远。这里最大的不同在于用 GUI 设置和用于处理用户输入的事件循环替代了循环结构。其他的不同则是 GUI 开发需要采取的各种方式来制作一个可用的用户界面。在采用 Tk GUI 开发的时候,你需要了解两个基础的概念: 部件 widget 几何管理器 geometry manager

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

几何管理器在放置部件在显示窗口中的位置上扮演着至关重要的角色。有一些不同的几何管理器可以供你使用。在这篇文章中,我主要使用了 grid 几何来让部件在整齐的行中进行布局。我会在这篇文章的结尾地方解释一些几何管理器的不同之处。

用 wish 进行猜数字游戏

这个示例游戏代码与我其他文章中的示例有所不同,我将它分解为若干部分以方便解释。

首先创建一个基本的可执行脚本 numgame.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 执行。接下来,创建了几个全局变量。这里我使用全部大写字母定义全局变量,这些变量将绑定到跟踪这些值的窗口小部件(LOWHIGH等等)。

全局变量 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 < $LOW } {
        set STATUS "What?"
    } elseif { $guess > $HIGH } {
        set STATUS "Huh?"
    } elseif { $guess < $num } {
        set STATUS "Too low!"
        set LOW $guess
    } 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 <Return> {.quit invoke}
    }

    set GUESS ""
}

这是主要的猜数逻辑循环。global 语句让我们能够修改在文件开头创建的全局变量(关于此主题后面将会有更多解释)。这个条件判断寻找入力范围在 1 至 100 之外以及已经被用户猜过的值。有效的猜测和随机值进行比较。LOWHIGH 的猜测会被追踪,作为 UI 中的全局变量进行报告。在每一步,全局 STATUS 变量都会被更新,这个状态信息会自动在 UI 中显示。

对于正确的猜测,destroy 语句会移除 “Guess” 按钮以及输入窗口,并重新绑定回车键,以激活 “Quit” 按钮。

最后的语句 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 <Return> {.guess invoke}

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

button 行创建了 “Guess” 和 “Quit” 按钮, -command 选项设定了当按钮被按下时要执行的操作。按下 “Guess” 按钮执行了上面的 check_guess 函数以检查用户输入的值。

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

focus 命令是用户界面的一项改进,使程序启动时输入部件处于激活状态。没有此命令,你需要先点击输入部件才可以输入。

bind 命令允许你在按下回车键时自动点击 “Guess” 按钮。如果你记得 check_guess 中的内容,猜测正确之后会重新绑定回车键到 “Quit” 按钮。

最后,这部分设定了图形用户界面的布局:

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

grid 几何管理器被逐步调用,以逐渐构建出预期的用户体验。它主要设置了五行部件。前三行是显示不同值的标签,第四行是 “Guess” 按钮和 entry 部件,最后是 “Quit” 按钮。

程序到此已经初始化完毕,wish shell 进入事件循环,等待用户输入整数并按下按钮。基于其在被监视的全局变量中找到的变化,它会更新标签。

注意,输入光标开始就在输入框中,而且按下回车键将调用适当且可用的按钮。

这只是一个初级的例子,Tcl/Tk 有许多可以让间隔、字体、颜色和其他用户界面方面更具有吸引力的选项,这超出了本文中简单 UI 的示例。

运行这个应用,你可能会注意到这些部件看起来并不很精致或现代。这是因为我正在使用原始的经典部件集,它们让人回忆起 X Windows Motif 的时代。不过,还有一些默认的部件扩展,被称为主题部件,它们可以让你的应用程序有更现代、更精致的外观和感觉。

启动游戏!

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

$ ./numgame.wish

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

用 Wish 编写的猜数游戏

进一步了解 Tcl

Tcl 支持命名空间的概念,所以在这里使用的变量并不必须是全局的。你可以把绑定的部件变量组织进不同的命名空间。对于像这样的简单程序,可能并不太需要这么做。但对于更大规模的项目,你可能会考虑这种方法。

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

最后,在这篇文章中,我没有提到几何管理器,它们用于以特定的顺序展示部件。只有被某种几何管理器管理的部件才能显示在屏幕上。grid 管理器相当简洁,它按照从左到右的方式放置部件。我使用了五个 grid 定义来创建了五行。另外还有两个几何管理器:place 和 pack。pack 管理器将部件围绕窗口边缘排列,而 place 管理器允许固定部件的位置。除这些几何管理器外,还有一些特殊的部件,如 canvastextpanedwindow,它们可以容纳并管理其他部件。你可以在经典的 Tcl/Tk 参考指南,以及 Tk 命令 文档页上找到这些部件的全面描述。

继续学习编程

Tcl 和 Tk 提供了一个简单有效的方法来构建图形用户界面和事件驱动应用程序。这个简单的猜数游戏只是你能用这些工具做到的事情的起点。通过继续学习和探索 Tcl 和 Tk,你可以打开构建强大且用户友好的应用程序的无数可能性。继续尝试,继续学习,看看你新习得的 Tcl 和 Tk 技能能带你到哪里。

(题图:MJ/40621c50-6577-4033-9f3c-8013bd0286f1)


via: https://opensource.com/article/23/4/learn-tcltk-wish-simple-game

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

本文由 LCTT 原创编译,Linux中国 荣誉推出