你好,这里是BIM的乐趣,我是九哥~
通过前面两篇文章,我们知道了如何创建UI和使用按钮小部件,希望到目前为止的示例,能让你从Python的角度来阅读MSDN文档。
在本文中,我们来看看最基本的小部件之一——Panel。它同时也是最无聊的,因为它实际上什么都没做,然而,它对于几乎任何GUI都是最基本的。为了让本篇文章更有意思一些,我会对UI的样式做一些调整,主要是改变外观颜色的一些方法。
The Panel
该面板通常称为容器小部件。它本身不做任何事情,而且你甚至很少希望直接在面板上捕获事件。它能做的就是包含其他小部件(因此叫容器)。因此,你可以使用"面板"将小部件分组到 GUI 中。通过并排布置面板并调整它们对调整大小的响应方式,你可以轻松地控制程序的布局。
同样,从示例中,我们可以看到 Panel构造函数不采用任何参数:
Panel panel1 = new Panel();
我们向面板添加小部件的方式与对窗体相同。若要创建包含按钮的面板,并把它放在窗体上,请执行以下操作:
from System.Windows.Forms import Application, Button, Form
class FunnyBIM(Form):
def __init__(self):
panel = Panel()
button = Button()
panel.Controls.Add(button)
self.Controls.Add(panel)
这个没啥意思,就不截图了。
当你一起使用其中的几个面板时,它们真的会变成自己的面板。为了能够看到我们创建的不同面板之间的不同,我们将研究如何改变它们的颜色(及其外观的其他元素)。
Style
面板,像所有小部件一样,从Control 基类继承。控件定义与小部件样式相关的某些属性。
如果你浏览面板成员名单,你可以看到所有小组成员。对于此条目,我们将使用 :
-
-
- BackColor
- BorderStyle
- ForeColor
-
请注意,对于Panel小部件的 Text 属性,文档显示:
Overridden. This member is not meaningful for this control.
并非所有从 Control 继承的成员对于每个小部件都有意义。获取或设置面板的"Text"属性没有意义。
颜色
对于Panel,ForeColor将是该面板上任何文本(标签)的颜色,它也将是你放置在那里的任何小部件的 ForeColor。
前景色和背景色都是 System.Drawing.Color 结构.通过从"Color Members"的列表中选择名称来选择哪种颜色。
要将面板前景颜色设置为蓝色,我们需要确保代码中包含以下内容:
-
-
- 添加对System.Drawing 的引用。
- 导入Color名称
- 在小部件上设置ForeColor 或 BackColor 属性
-
所以,类似这样:
import clr
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')
from System.Drawing import Color
from System.Windows.Forms import Application, Form, Panel
class FunnyBIM(Form):
def __init__(self):
panel = Panel()
panel.ForeColor = Color.Blue
self.Controls.Add(panel)
到目前为止,我们主要处理对象属性。.NET 中的属性意味着在 Python 中相同的方法。除了设置组件的颜色或高度,我们还可以检查(获取)属性。
from System.Drawing import Color
from System.Windows.Forms import Application, Panel
class FunnyBIM(Form):
def __init__(self):
formHeight = self.Height
formWidth = self.Width
print 'Height = ', formHeight
print 'Width = ', formWidth
与 ForeColor 更正常地更改面板的BackColor ,你可以通过更改小部件的颜色属性来直接更改其颜色。
边框样式
我们影响容器小部件绘制方式的另一种方式是使用BorderStyle属性。这需要边框样式枚举。枚举的成员实际上是常量,它告诉 .NET 框架要使用哪种边框样式。
从文档中,你可以看到三种不同类型的边框可用:
-
-
- Fixed3D三维边框—— BorderStyle.Fixed3D
- FixedSingle 单行边框——BorderStyle.FixedSingle
- None无边框——BorderStyle.None
-
因此,要给面板一个三维边框,你需要以下代码:
from System.Windows.Forms import Application, Form, BorderStyle, Panel
class FunnyBIM(Form):
def __init__(self):
self.panel = Panel()
panel.BorderStyle = BorderStyle.Fixed3D
self.Controls.Add(self.panel)
在窗体上设置边框样式是不同的。在窗体上使用 FormBorderStyle属性,该属性采用FormBorderStyle 枚举值。
选项包括 :
-
-
- Fixed3D——固定的三维边框。
- FixedDialog——粗的、固定的对话框样式边框。
- FixedSingle——固定的单行边框。
- FixedToolWindow——无法调整大小的工具窗口边框。
- None——无边框。
- Sizable ——(默认值) 可调整大小的边框。
- SizableToolWindow——工具窗口不会显示在任务栏中,也不显示在用户按 ALT+TAB 时显示的窗口中。
-
稍后,我们将把所有这些知识与位置结合使用。Location允许你指定小部件的位置。此位置相对于其父小部件,0,0是左上角。这意味着10、10的位置是父级左上角的 10 像素向下和 10 像素。小部件位于你指定的位置,其左上角。
过去,我们使用"Height高度"和"Width宽度"来设置控件的尺寸。也可以使用 Size 属性完成。它以大小结构作为值。
由于"Size结构"具有公共属性、高度和宽度,因此使用Size 属性往往更为冗长。有时,你可能希望重新使用从其他地方获取的"Size结构"(例如图像大小),然后设置(或获取)Size 属性很方便。
FunnyBIM窗口
让我们用一些示例代码来结束这一点,这些代码使用了本篇文章中介绍的所有不同内容。
我们将创建一个UI窗口(像往常一样,一个子类的窗体)与几个子面板。
我们将更改这些面板的大小和样式,并使用"Location位置"将一些按钮放在其中。
为了做一些新的事情,我们将设置我们的主要应用程序窗口的尺寸,根据我们的用户有屏幕的大小。
这很容易从. System.Windows.Form.Screen 类的 GetWorkingSize静态方法完成。我相信你能从下面的代码中找出来。
本示例将主窗体拆分为两个水平面板。我们希望每个面板的高度是主窗体宽度的一半。在 Windows 上 , 如果我们只是使用self。总高度将包括标题栏高度。为了获得正确的高度,我们使用 Form 属性 ClientRectangle。这将返回一个System.Drawing.Rectangle Structure。在Rectangle Members 列表中,我们可以看到它有一个高度Members 。代码示例演示它是一个普通整数,因此我们可以使用它来获取Form的实际高度:
public int Height { get; set; }
import clr
clr.AddReference('System.Drawing')
clr.AddReference('System.Windows.Forms')
from System.Drawing import Color, Point
from System.Windows.Forms import (Application, BorderStyle, Button,
Form, FormBorderStyle, Label, Panel, Screen)
class FunnyBIMForm(Form):
def __init__(self):
self.Text = "FunnyBIM"
self.FormBorderStyle = FormBorderStyle.FixedDialog
screenSize = Screen.GetWorkingArea(self)
self.Height = screenSize.Height / 3
#self.Width = screenSize.Width / 3
self.Width = 440
self.panelHeight = self.ClientRectangle.Height / 2
self.setupPanel1()
self.setupPanel2()
self.setupCounters()
self.Controls.Add(self.panel1)
self.Controls.Add(self.panel2)
def setupPanel1(self):
self.panel1 = Panel()
self.panel1.BackColor = Color.LightSlateGray
self.panel1.ForeColor = Color.Blue
self.panel1.Width = self.Width
self.panel1.Height = self.panelHeight
self.panel1.Location = Point(0, 0)
self.panel1.BorderStyle = BorderStyle.FixedSingle
self.label1 = Label()
self.label1.Text = "继续-点这里"
self.label1.Location = Point(20, 20)
self.label1.Height = 25
self.label1.Width = 175
self.button1 = Button()
self.button1.Name = '1'
self.button1.Text = '点这里 1'
self.button1.Location = Point(20, 50)
self.button1.Click += self.update
self.panel1.Controls.Add(self.label1)
self.panel1.Controls.Add(self.button1)
def setupPanel2(self):
self.panel2 = Panel()
self.panel2.BackColor = Color.LightSalmon
self.panel2.Width = self.Width
self.panel2.Height = self.panelHeight
self.panel2.Location = Point(0, self.panelHeight)
self.panel2.BorderStyle = BorderStyle.FixedSingle
self.subpanel1 = Panel()
self.subpanel1.BackColor = Color.Wheat
self.subpanel1.Width = 175
self.subpanel1.Height = 100
self.subpanel1.Location = Point(25, 25)
self.subpanel1.BorderStyle = BorderStyle.Fixed3D
self.label2 = Label()
self.label2.Text = "继续-点这里"
self.label2.Location = Point(20, 20)
self.label2.Height = 25
self.label2.Width = 175
self.button2 = Button()
self.button2.Name = '2'
self.button2.Text = '点这里 2'
self.button2.Location = Point(20, 50)
self.button2.Click += self.update
self.subpanel1.Controls.Add(self.label2)
self.subpanel1.Controls.Add(self.button2)
self.subpanel2 = Panel()
self.subpanel2.BackColor = Color.Transparent
self.subpanel2.Width = 175
self.subpanel2.Height = 100
self.subpanel2.Location = Point(220, 25)
self.subpanel2.BorderStyle = BorderStyle.Fixed3D
self.label3 = Label()
self.label3.Text = "继续-点这里"
self.label3.Location = Point(20, 20)
self.label3.Height = 25
self.label3.Width = 175
self.button3 = Button()
self.button3.Name = '3'
self.button3.Text = '点这里 3'
self.button3.Location = Point(20, 50)
self.button3.Click += self.update
self.subpanel2.Controls.Add(self.label3)
self.subpanel2.Controls.Add(self.button3)
self.panel2.Controls.Add(self.subpanel1)
self.panel2.Controls.Add(self.subpanel2)
def setupCounters(self):
self.counterDict = {
'1': 0,
'2': 0,
'3': 0,
}
def update(self, sender, event):
name = sender.Name
self.counterDict[name] += 1
label = getattr(self, 'label' + name)
label.Text = "你点了这里 %s 次." % self.counterDict[name]
form = FunnyBIMForm()
Application.Run(form)
运行后效果如下:
好了,今天的分享就到这里,小伙伴们快去自己尝试吧~