分享

窗体应用程序中的Panel和Style——WindowsForm系列教程

 BIM的乐趣 2022-09-29 发布于北京

Dynamo案例百解累积更新(2021.04)介绍~

Dynamo PythonScript 代码速查手册By九哥

你好,这里是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 clrclr.AddReference('System.Windows.Forms')clr.AddReference('System.Drawing')
from System.Drawing import Colorfrom 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 Colorfrom 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 clrclr.AddReference('System.Drawing')clr.AddReference('System.Windows.Forms')
from System.Drawing import Color, Pointfrom 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)

运行后效果如下:

好了,今天的分享就到这里,小伙伴们快去自己尝试吧~



九哥出品,必属精品

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多