你好,这里是BIM的乐趣,我是九哥~
很多程序的GUI中都有两个常见小部件:单选按钮和复选框。
这些是直观地向用户提供多种选择的方法。我敢肯定,你们都熟悉这些形式的输入,但复选框允许用户打开和关闭个别选项,而单选按钮允许用户选择一个选项。
在 IronPython中,我们可以相当容易的设置这些小部件。我们可以询问他们,找出他们处于什么状态,或者设置当用户做出选择时要执行的操作。你可以使用此选项根据选择的选项动态更改 GUI 的状态。
这两个小部件的使用非常相似。让我们从使用 CheckBox 的示例开始。
同样,Microsoft MSDN 文档中的代码示例告诉我们CheckBox的构造函数不采用任何参数:
CheckBox checkBox1 = new CheckBox();
下面的示例显示了 CheckBox 上可用的几个有用属性。
import clr
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')
from System.Drawing import Point
from System.Windows.Forms import Application, Button, CheckBox, Form, Label
class CheckBoxExampleForm(Form):
def __init__(self):
self.Text = "BIM软件使用调研:"
self.Width = 400
self.Height = 125
self.label = Label()
self.label.Text = "选择你使用的BIM软件"
self.label.Location = Point(25, 25)
self.label.AutoSize = True
self.check1 = CheckBox()
self.check1.Text = "Revit"
self.check1.Location = Point(25, 50)
self.check1.Width = 90
self.check2 = CheckBox()
self.check2.Text = "ArchiCAD"
self.check2.Location = Point(125, 50)
self.check2.Width = 110
self.check3 = CheckBox()
self.check3.Text = "Bently"
self.check3.Location = Point(240, 50)
self.check3.Width = 120
self.check3.Checked = True
self.Controls.Add(self.label)
self.Controls.Add(self.check1)
self.Controls.Add(self.check2)
self.Controls.Add(self.check3)
form = CheckBoxExampleForm()
Application.Run(form)
请注意,这一次我们使用标签的 AutoSize属性以避免显式设置大小。当我们更新文本时,标签将自动调整大小,以便其全部内容可见。
我们设置了第三个 CheckBox,使用"已选中的属性"开始选中。这是一个属性,因此我们可以"检查"此值以查看按钮处于什么状态。
单选按钮同样易于使用。
它使用的方式与CheckButton相同,具有一组类似的Member。我们将设置要检查的第一个按钮。
除此之外,我们将在单选按钮更改状态时设置要调用的方法。为此,我们将使用CheckedChange 事件。我们可以检查按钮的状态,因为我们知道事件的发送方参数将是已更改的控件。
无论如何,足够的解释和代码。为了让它更有趣一点,我们将对最后一个标签使用的字体进行修改。
import clr
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')
import sys
sys.path.append('c:\\Python24\\Lib')
from random import random
from System.Drawing import Color, Font, FontStyle, Point
from System.Windows.Forms import (Application, BorderStyle, Button, CheckBox,Form, Label, Panel, RadioButton)
class ChecksAndRadiosForm(Form):
def __init__(self):
self.Text = "BIM软件使用调研:"
self.Width = 400
self.Height = 300
self.setupCheckButtons()
self.setupRadioButtons()
self.Controls.Add(self.checkPanel)
self.Controls.Add(self.radioPanel)
def newPanel(self, x, y):
panel = Panel()
panel.Width = 400
panel.Height = 150
panel.Location = Point(x, y)
panel.BorderStyle = BorderStyle.Fixed3D
return panel
def setupCheckButtons(self):
self.checkPanel = self.newPanel(0, 0)
self.checkLabel = Label()
self.checkLabel.Text = "选择你使用的BIM软件"
self.checkLabel.Location = Point(25, 25)
self.checkLabel.AutoSize = True
self.check1 = CheckBox()
self.check1.Text = "Revit"
self.check1.Location = Point(25, 50)
self.check1.Width = 90
self.check2 = CheckBox()
self.check2.Text = "ArchiCAD"
self.check2.Location = Point(125, 50)
self.check2.Width = 110
self.check3 = CheckBox()
self.check3.Text = "Bently"
self.check3.Location = Point(240, 50)
self.check3.Width = 120
self.checkPanel.Controls.Add(self.checkLabel)
self.checkPanel.Controls.Add(self.check1)
self.checkPanel.Controls.Add(self.check2)
self.checkPanel.Controls.Add(self.check3)
def setupRadioButtons(self):
self.radioPanel = self.newPanel(0, 150)
self.radioLabel1 = Label()
self.radioLabel1.Text = "告诉我你的性别"
self.radioLabel1.Location = Point(25, 25)
self.radioLabel1.AutoSize = True
self.radio1 = RadioButton()
self.radio1.Text = "男"
self.radio1.Location = Point(25, 50)
self.radio1.Checked = True
self.radio1.CheckedChanged += self.checkedChanged
self.radio2 = RadioButton()
self.radio2.Text = "女"
self.radio2.Location = Point(150, 50)
self.radio2.CheckedChanged += self.checkedChanged
self.radio3 = RadioButton()
self.radio3.Text = "外星人"
self.radio3.Location = Point(300, 50)
self.radio3.CheckedChanged += self.checkedChanged
self.radioLabel2 = Label()
self.radioLabel2.Text = "来吧,告诉我!"
self.radioLabel2.Location = Point(25, 80)
self.radioLabel2.AutoSize = True
self.radioLabel2.Font = Font("华文彩云", 15, FontStyle.Bold)
self.radioLabel2.ForeColor = Color.Red
self.radioPanel.Controls.Add(self.radioLabel1)
self.radioPanel.Controls.Add(self.radioLabel2)
self.radioPanel.Controls.Add(self.radio1)
self.radioPanel.Controls.Add(self.radio2)
self.radioPanel.Controls.Add(self.radio3)
def checkedChanged(self, sender, args):
if not sender.Checked:
return
if sender.Text == "外星人":
self.radioLabel2.Text = "你在开玩笑吗 ?"
style = FontStyle.Bold | FontStyle.Italic
self.radioLabel2.Font = Font("楷体", 15, style)
self.radioLabel2.ForeColor = Color.FromArgb(int(random() * 256),int(random() * 256),int(random() * 256))
else:
self.radioLabel2.Text = "说得对"
self.radioLabel2.Font = Font("华文行楷", 15, FontStyle.Regular)
self.radioLabel2.ForeColor = Color.Red
form = ChecksAndRadiosForm()
Application.Run(form)
在 Windows 上,如下所示
如果你告诉我你是一个外星人,它做这样的事情:
RadioButton 的东西很简单,新的是我们使用字体和颜色的方式。
我们使用字体类初始化新字体。从字体构造函数文档中,您可以看到有几种不同的方法来初始化它。
我们使用的两个是:
字体(字符串、单字符样式)
这将从名称和大小初始化新字体。
字体(字符串、单字符样式、字体样式)
这将从名称、大小和样式初始化新字体。
在第一种情况下,我们只提供一个字体名称和大小。构造函数签名调用用于大小为Single的对象类型。在 C# 示例中,你可以看到它指定为浮点数。IronPython 并不复杂, 允许我们使用整数。
在第二种情况下(在ChecksandRadiosForm.checkedChanged中使用),我们指定了 FontStyle。FontStyle 是具有各种不同成员的枚举,用于表示不同的样式:
-
- Bold——粗体文本;
- Italic——斜体文本;
- Regular——普通文本;
- Strikeout——中间有一行的文本;
- Underline——下划线文本。
如果我们想要组合它们,我们可以使用"或"运算符" | "。这将返回一个新的字体样式,其中选择了多种样式。
以下代码将生成粗体、带下划线的文本:
style = FontStyle.Bold | FontStyle.Italic | FontStyle.Underline
你不能更改字体的样式。Style属性是只读的。它的大小,你可以使用SizeInPoints 属性检查它的大小。如果要更改文本样式,必须创建新字体并替换旧字体。
我们还用了一个巧妙的技巧,我们的老朋友Color。我们不是使用预定义的颜色,而是使用Color.FromArgb 方法创建了一个。同样,这有几个构造函数。我们传递了三个表示红色、绿色和蓝色分量的整数。
是不是很简单~我认为我们有足够的了解,学习一个更明智的方法来布局我们的GUI。
好了,今天的分享就到这里,小伙伴们快去自己尝试吧~