百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Rhino6.0 窗口开发使用角本说明

zhezhongyun 2025-08-02 22:45 2 浏览

第1个:生成窗口代码

第2点:Eto 界面主要由 Dialog(主程序界面)、Layout(界面布局)和 Controls(控件)三个部分构成,逻辑简单且清晰。

这个脚本被分为三个主要部分。

  1. 该import部分包括脚本所需的所有程序集。
  2. 对话类定义SampleRoomNumberDialog()
  3. 脚本本身RequestRoomNumber()

该Rhino.UI程序集用于在Rhino和Eto之间进行接口连接。当使用dialog.ShowModal方法时,使用Rhino.UI.RhinoEtoApp.MainWindow类可以将对话框显示为Rhino应用程序的子项。

Eto 是一个大型命名空间。接下来的两行import 访问了 Eto 最常引用的部分,即Eto.Drawing 命名空间和Eto.Forms。命名空间Eto.Drawing 包含帮助处理对象图形属性的特定类。命名空间Eto.Forms 包含对话框、布局和对话框控件。使用 Python 的重命名功能,这些命名空间被缩短为drawing 和forms。

自定义对话框类

代码的下一部分创建了一个新的类定义,该定义扩展了 Dialog(T) 类。在 Python 中创建类 需要一些非常特定的语法。虽然创建类可能看起来稍微复杂一些,但在 Python 脚本中重用、导入和与基于类的对话框进行交互的能力是非常值得的。类将包含有关类控件默认布局和默认操作的默认信息。类还将用于在脚本运行期间存储所有控件的值。

对话类通过这些行启动:

在这种情况下,新类将被命名为 SampleEtoRoomNumberDialog 并继承 Eto 类 Eto.Froms.Dialog[bool]。 bool 参数表明对话框将返回一个布尔值。 这个布尔值可以用来判断当对话框退出时 OK 或 Cancel 按钮是否被点击。如果需要从对话框返回多个返回值,除了 True/False 之外,可能需要一个 Dialog[int] 或 Dialog[string]。

注意,本指南仅涵盖模型对话框的创建,这些对话框要求用户在继续程序之前做出响应。 其他对话框类型,半模型和无模型,超出了本指南的范围,但在未来的项目中可能会很有用。

对话框形式

一旦新类被声明,那么init初始化操作将默认值分配给新对话对象。Python在类声明中使用self变量来引用init中的类成员。这self类比于类被实际创建在脚本中后的一个占位符,用于引用类名。

初始化部分包括所有对话框都拥有的几个常见属性:

  1. super().__init__()- 初始化基类。
  2. self.Title- 设置对话框的标题。这是一个标准字符串。
  3. self.Padding - 设置一个空白边界区域,任何子内容都会被放置在这个区域内。这需要创建一个 Eto.Drawing.Padding 结构。
  4. self.Resizable- 对话框是否可以通过鼠标拖动来调整大小。这是一个真/假布尔值。

有几种Padding格式被Eto.Drawing.Padding接受。这些符合标准CSS样式的边距和填充格式:

  • Eto.Drawing.Padding(10)- 四周各留10像素的填充。
  • Eto.Drawing.Padding(10, 20)- 左右各填充10,上下各填充20。
  • Eto.Drawing.Padding(10, 20, 30, 40)- 左边填充10,上边填充20,右边填充30,下边填充40。

默认情况下,对话框会自动调整其大小以适应其包含的内容。 但是,可以添加一行代码来使用self.ClientSize设置对话框的初始大小:

self.ClientSize = drawing.Size(300, 400) #sets the (Width, Height)

ClientSize 属性采用一个Eto.Drawing.Size 结构。

在我们创建了控件和布局后,可以使用 self.Content 类将内容放置在对话框中,如第39行所示:

self.Content = layout

对话框类将在屏幕上显示为模态。要关闭对话框,将按下按钮。要关闭对话框,请使用self.Close方法。在关闭对话框之前进行一些数据检查是常见的:

该self.Close方法也返回一个False,因为按下了取消按钮以引发此事件。脚本将根据对话框的返回值继续执行。

此外,因为我们使用了一个新的类对象来创建对话框,即使对话框关闭后,对话框仍然会保留在内存中。这意味着对话框中的方法和值将在脚本的作用域内继续可用,因为脚本可能需要引用这些值。

在创建对话框架后,我们将开始为对话创建一些控件。

控制

对话的商业端是它显示的用户界面控件。控件可能包括标签、按钮、编辑框和滑块。在Eto中,有超过35种不同的控件可以创建。

控件通常需要在布局中正确设置后才能添加到对话框中。

标签控件

最简单的控件是Label控件。它只是一个文本片段,通常用于为其他控件创建提示或标签。

self.m_label = forms.Label()

self.m_label.Text = 'Enter the Room Number:'

和许多控件一样,上面的行为控件创建一个名称m_label。然后,标签的主要属性是通过设置标签的 Text 属性来显示的文本。

通常情况下,标签的复杂程度到这里就足够了,但标签还有许多其他属性。Text 附加属性包括VerticalAlignment、Horizontal Alignment、TextAlignment、Wrap、TextColor和Font。可以通过使用逗号(,)来将属性添加到文本属性中:

文本框控件

TextBox 用于在对话框中输入字符串。要检查脚本中文本框的内容,文本框控件必须有一个名称来引用它。

在这种情况下,名称m_textbox可以在第46行开始的类方法中引用该控件:

def GetText(self):

return self.m_textbox.Text

只是创建一个新的Eto.Forms.TextBox()很常见。TextBox还有许多额外的属性可以用来控制输入。这些属性包括MaxLength、PlaceholderText、InsertMode以及许多可以在Eto TextBox 类中看到的。

按钮控制

按钮可以分配任何名称。除了名称,Text 属性可以设置显示在按钮上.

按钮几乎放置在每个对话框上。按钮被创建,然后通过其 .Click事件绑定来在点击按钮时运行一个方法。

self.DefaultButton = forms.Button()

self.DefaultButton.Text ='OK'

一旦创建,按钮就可以通过OnOKButtonClick将事件方法绑定到按钮上.Click类使用+=语法如下:

self.DefaultButton.Click += self.OnOKButtonClick

如果点击按钮,将运行绑定方法。该绑定方法在类的稍后部分的方法部分中声明:

def OnOKButtonClick(self, sender, e):

if self.m_textbox.Text == "":

self.Close(False)

else:

self.Close(True)

在这种情况下,按钮被点击,绑定的方法OnOKButtonClick检查m_textbox的文本,以确定是否输入了任何内容。然后该方法关闭对话框,返回True或False。

Eto.Dialog 类 有两个特殊的保留名称,即 DefaultButton 和 AbortButton。 DefaultButton 名称将创建一个标准按钮,并且如果使用 Enter Key,还会接收点击事件。 AbortButton 是一个按钮,如果使用 键,将会接收 .Click 事件。 这些按钮是通过控件的名称简单分配的,使用 语法。ESCself

布局

布局用于以逻辑方式调整对话框中控件的大小和位置。它们通常可以被视为根据其内容调整的网格控件。示例代码在本节代码的第33行创建了一个新的布局:

布局的代码在类定义的下面,因为似乎在放置控件之前先创建控件是有意义的。在这种情况下,在以下位置创建了一个新的动态布局对象:layout = forms.DynamicLayout()

动态布局Eto 支持的5种布局类型之一。动态布局是一个虚拟网格,可以垂直和水平地组织控件。要详细了解布局,请参阅Eto 在 Python 中的布局指南。控件在布局中的间距由layout.Spacing设置在行上:

layout.Spacing = drawing.Size(5, 5)

设置控件之间的水平间距和垂直间距为5像素。Eto.Drawing.Size(5, 5)

在布局中放置行

一旦布局类型设置好后,就可以放置控件。控件被放置在行中。

每一行都可以添加到新创建的Eto.Forms.Layout对象中,使用.AddRow方法。每行中添加的每个控件都会在添加的行上获得一个单元格。所以如果添加了两个控件,行将包含两个控制控件放置的单元格。控件将拉伸以填充单元格。

该Eto.Forms.DynamicLayout控件可以垂直和水平定位。每个垂直的控件集可以与之前水平部分的控件对齐,从而非常方便地构建表单。更多信息请参阅Eto DynamicLayout 文档

使用无在布局中

在布局中有时需要空白占位符来帮助控件正确对齐或帮助对齐上方的单元格数量。或者,可能需要一个空白表单,以使布局的高度填充对话框的垂直空间。在Eto中,使用None值将允许在对话框中使用占位符。在上面的示例中,在控件之间添加了一行空白:

layout.AddRow(None) # spacer

如果对话框垂直变高,那么None行将扩展以填充所需的空间。None 也可以在行中用作水平填充。 例如,通过在行的开头添加一个None填充器,按钮可以动态地在行的右侧对齐:

layout.AddRow(None, self.DefaultButton, self.AbortButton)

该None单元格将扩展和收缩以使右侧的按钮对齐。

在使用Eto的Layout、 Rows和Cells放置控件时有很多选择。有关使用布局的详细信息,请参阅Eto Layout高级选项与Python。

控制委托和事件

对话类的最后部分,在这个例子中,是一系列类方法:

  1. 访问类成员的方法
  2. 用于绑定到控件事件的方法操作。

一种常见的做法是创建一个函数,该函数返回您可能希望获取或设置的控件的值:

在方法声明中,这里有一个不寻常的语法,包含(self)作为函数的参数。这在类成员函数中完成。self变量就像是这个方法所属的类名的占位符。

在脚本中使用此方法的语法如下:

在这种情况下,创建了一个名为dialog的新对话框。对话框显示,并将返回值赋给rc变量。然后,根据rc的结果,使用GetText方法通过dialog.GetText()方法获取对话框中文本框的值,即使对话框已经关闭。

类方法还需要创建来处理对话框中控件可能会发生的事件。以下是一个将用于OK按钮的函数:

再次在这里是方法声明的不寻常语法:(self, sender, e). 这是任何将绑定到控件操作的函数的标准参数声明。这个OnOKButtonClick()方法将通过此代码绑定到OK按钮点击:

self.DefaultButton.Click += self.OnOKButtonClick

所以现在每次点击时,该方法将会被调用。

控件上可以绑定许多其他事件的方法,例如 TextChangedCheckedChangedAddValue 等等。

在脚本中使用Eto对话框

一旦类定义设置完成,对话框就可以在脚本中使用:

首先创建一个对话框的新类实例:

dialog = SampleEtoRoomNumberDialog();

一旦创建后,该对话框需要显示为Rhino应用程序的子项:

rc = dialog.ShowModal(Rhino.UI.RhinoEtoApp.MainWindow)

由于对话框是模态的,只有在对话框关闭后,脚本才会继续执行下一条语句。当dialog.Close被调用时,对话框还会返回一个值,该值被赋给rc。

脚本继续执行,检查返回rc值,并且还引用了dialog.GetText()值。请记住,即使对话框被关闭,对话框控件的值仍然可用。

相关推荐

Excel高效技巧:批量合并重复数据的实用指南

在日常数据处理中,我们常会遇到需要合并相邻重复单元格的场景。无论是整理分类标签、统计重复项还是优化报表格式,手动逐个合并不仅耗时且容易出错。本文将详细介绍三种专业高效的批量合并方法,助您轻松应对各种复...

自主研发高速动车组列车又添新成员(新时代画卷)

数据来源:国铁集团">数据来源:国铁集团CR400AF—S型列车驶过重庆。龙帆摄(人民视觉)">CR400AF—S型列车驶过重庆。龙帆摄(人民视觉)CR400BF—GZ型列车行驶在京...

福彩双色球幻圆图的VBA程序(第一部分)

很多朋友喜欢玩福彩双色球彩票,都知道下面的这张图——福彩双色球红球幻圆图和篮球幻方图。图2是福彩双色球2024104期(红色)和2024105期(黄色)的幻圆图。图3是福彩双色球2024105期(红色...

技巧 | 往MCP服务器添加提示词模板

在我的上一篇文章[1]中,我已经构建了一个本地MCP服务器并向其添加了一些工具。在本文中,我们将向该MCP服务器添加提示词。这是如同上一篇博客的文件结构。但在这里,我为此创建了两个新文件。.├──...

Avalonia日志组件实现与优化指南

背景Avalonia目前没有富文本框可实现日志输出显示,但提供了SelectableTextBlock控件可以替换,这是站长实现的一个日志组件效果:可展示日志时间、日志级别、日志详细内容等,后台除输...

vim编辑器最后几行@代表什么意思

使用vim编辑文本时,屏幕下方会出现一些@符号,这些符号代表什么意思?当vim设置了wrap属性时,若一行太长则就会发生折行现象,此时一个逻辑行就会显示多个屏幕行,如下图由于文件的第2行太长,一个真实...

浅色AI云食堂APP完整代码(二)

以下是整合后的浅色AI云食堂APP完整代码,包含后端核心功能、前端界面以及优化增强功能。项目采用Django框架开发,支持库存管理、订单处理、财务管理等核心功能,并包含库存预警、数据导出、权限管理等增...

QML控件:TextInput, TextField, TextEdit, TextArea用法及自定义

本文主要介绍基本元素TextInput,TextField,TextEdit,TextArea等的基本属性。Textlnput与TextField为行编辑控件,TextEdit与T...

WPF - 10.特殊容器控件

摘要这里我们要介绍的特殊容器空间是ScrollViewer,该控件与其他控件不同的是,可以支持滚动显示容器内的元素。下面我们举例说明如何在WPF中使用ScrollViewer控件。新建一个WPF程...

rhino6.0 python中ETO的组件案例

1.按钮组件按钮几乎放置在每个对话框上。创建一个新的按钮很简单。使用forms.Button并指定Text显示在按钮面上。除了创建新按钮外,通常还通过.Click事件附加一个操作。使用+=语法,如下...

Rhino6.0 窗口开发使用角本说明

第1个:生成窗口代码第2点:Eto界面主要由Dialog(主程序界面)、Layout(界面布局)和Controls(控件)三个部分构成,逻辑简单且清晰。这个脚本被分为三个主要部分。该import...

手把手教你搭建属于自己的服务器!

最近总是想搭建自己的网站,奈何皮夹里空空如也,服务器也租不起,更别说域名了。于是我就寻思能否自己搭建个服务器,还不要钱呢?还真行!!!经过几天的冲浪,我发现有两个免费的建站工具:Apache和Ng...

HEAT杂志《欧美猛男》排行!“雷神”居然没进前三!

提到猛男的必备条件,应该就是要有着让人看了会流口水的大块肌肉,而一说到猛男,小编第一个想到的就是spanstyle="text-transform:none;background-color:...

Power Query 表格列历遍函数Table.TransformColumns函数

PowerQuery提取数字应该是非常方便的,EH有这样一道题:一看到这题首先想的是PowerQuery,可能中毒有点深,思路挺简单的,PowerQuery有一个从数字到非数字的分列分列后再提取...

自学前端踩了30个坑,终于整理出这份新手避坑指南

这是我在自学前端的第37天,对着一个简单的HTML页面卡了整整一下午。不是逻辑错误,不是语法问题,只是我不知道为什么,一个div死活居中不了。那时候的我,以为前端就是写写页面、调调样式,直到后来才...