复选框和单选按钮——WindowsForm系列教程

你好,这里是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。


 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/374564.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis发布订阅及事务管理

目录 1.1 发布订阅 1.1.1 什么是发布订阅 1.1.2 常用命令 1.1.3 示例演示 1.2 事务管理 1.2.1 事务定义 1.2.2 Multi、Exec、discard 1.2.3 示例 1.2.4 事务的错误处理 1.2.5 事务的冲突问题 1.2.5.1 事务场景 1.2.5.2 悲观锁 1.2.5.3 乐观锁 1.2.5.4 事务解决冲…

CodeFuse-VLM 开源,支持多模态多任务预训练/微调

CodeFuse-MFT-VLM 项目地址:https://github.com/codefuse-ai/CodeFuse-MFT-VLM CodeFuse-VLM-14B 模型地址:CodeFuse-VLM-14B CodeFuse-VLM框架简介 随着huggingface开源社区的不断更新,会有更多的vision encoder 和 LLM 底座发布&#x…

PYthon进阶--网页采集器(基于百度搜索的Python3爬虫程序)

简介:基于百度搜索引擎的PYthon3爬虫程序的网页采集器,小白和爬虫学习者都可以学会。运行爬虫程序,输入关键词,即可将所搜出来的网页内容保存在本地。 知识点:requests模块的get方法 一、此处需要安装第三方库reques…

SaperaCamExpert(相机专家)中文使用指南

参考:SaperaCamExpert中文使用指南.PDF 文章目录 软件介绍安装首次打开资源占用率功能主界面布局菜单栏FileViewPre-Processing:预处理 Tools: 快捷键:新建;打开;保存;帮助Device窗体属性树图像…

算法day11

算法day11 239 滑动窗口最大值237 前K个高频元素栈与队列总结 滑动窗口最大值 第一想法,暴力解:这个解法会超时。(这就是为啥是困难题) 思路:每到一个新的窗口,就重新进行一次窗口中的max迭代&#xff0c…

【MySQL进阶之路】SpringBoot 底层如何去和 MySQL 交互了呢?

SpringBoot 底层如何去和 MySQL 交互了呢? 我们在写做 Java 项目时,一般都是引入 MyBatis 框架来和 MySQL 数据库交互,如果需要在 MySQL 上执行什么语句,只需要在 Mapper.xml 文件中定义对应的 SQL 语句即可 那么他底层到底是如…

浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE解决

ERR_SSL_KEY_USAGE_INCOMPATIBLE报错原因 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误通常发生在使用 SSL/TLS 连接时,指的是客户端和服务器之间进行安全通信尝试失败,原因是证书中的密钥用途(Key Usage)或扩展密钥用途(Extended Key Usage, EKU)与正在尝试的操作不兼容。这意味…

如何扩容C盘?6种扩展C盘方法!

1.C盘可以扩大吗? 因为C盘是系统盘,所以没有足够的空间会导致电脑变慢,影响程序或游戏的运行。新电脑C盘可能有足够的可用空间,但随着对电脑的使用,应用程序安装的越来越多。即便很多程序安装到D盘,但某些…

问题:塑瓷后的牙冠要比完成的牙冠大() #学习方法#其他

问题:塑瓷后的牙冠要比完成的牙冠大() A.10% B.10%-15% C.15%-20% D.20%-30% E.50% 参考答案如图所示

CSDN2024年我的创作纪念日1024天|不忘初心|努力上进|积极向前

CSDN2024年我的创作纪念日1024天| 学习成长机遇:学习成长收获:2023年度总结数据:2024新领域的探索:日常和自己的感慨:2024憧憬和规划:创作纪念日总结: 学习成长机遇: 大家好&#x…

Redis持久化、主从与哨兵架构详解

Redis持久化、主从与哨兵架构详解 Redis持久化 RDB快照(snapshot) 在默认情况下,Redis将内存数据库快照保存进名字为dump.rdb的二进制文件中 可以对redsi进行设置,让他在N秒内数据集至少有M个改动了,这一条件被满足…

【洛谷】P1596Lake Counting S(BFS解决连通性问题模板)

杂谈 大部分与检验连通性有关的题目,都可以归结为一个迷宫问题,那么就是 bfs 问题,可以查看一下笔者最近几篇用搜索方法解决连通性问题的题解,其中 bfs 解决的步骤十分固定,甚至可以说几道题的代码几乎一样&#xff…

Leetcode刷题笔记题解(C++):257. 二叉树的所有路径

思路:深度优先搜索 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right…

posix_memalign 与 malloc 对比

1. 原因原理 编程中的类型对齐问题主要是处于性能考虑,如果不做对齐,那么单个数据元素的访问很容易跨在多个时钟周期上,从而导致性能下降。 内建数据类型的对齐,是由编译器和C语言库的API实现中自动完成的,这对于用户是…

红队打靶练习:HEALTHCARE: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 1、gobuster 2、dirsearch WEB web信息收集 gobuster cms sqlmap 爆库 爆表 爆列 爆字段 FTP 提权 信息收集 本地提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Inte…

Vision Transformer(二):位置嵌入向量

1. 什么是位置嵌入向量 位置嵌入向量是Transformer兴起时就引入的一个概念。早期在处理文本信息时,词语之间是相关联的,只有具有一定位置关系的词语组合才能够表达一些正确的意思。 2. 在Transformer中是如何实现的? 在Transformer的训练过…

ubuntu22.04@laptop OpenCV Get Started: 000_hello_opencv

ubuntu22.04laptop OpenCV Get Started: 000_hello_opencv 1. 源由2. Hello OpenCV2.1 C应用Demo2.2 Python应用Demo 3. 参考资料 1. 源由 之前,通过敲门砖已经砸开了OpenCV的大门,接下来是体验下“Hello World!”程序。 2. Hello OpenCV …

洗地机值得买吗?四款好用的洗地机推荐

洗地机值得买吗,相比传统清洁工具而言,洗地机的优势明显,甚至可以说是代差级的优势。它可以一机多用,在扫地、拖地、滚刷自清洁、烘干/晾干上一次完成,不仅清洁能力强大又大大减少了家务所需的时间,是正儿八…

啤酒:畅享精酿啤酒与海鲜的鲜美滋味

夏日的阳光总是让人心生慵懒,而在这个季节里,没有什么比一杯冰镇啤酒和一串烤肉更能令人感到惬意了。当Fendi Club啤酒与烤肉相遇,它们将为你的夏日时光增添无尽的欢愉。 Fendi Club啤酒,以其醇厚的口感和酿造工艺收获了许多的啤酒…

専攻春节钜惠

専攻春节钜惠 大家好,新春佳节到来之际,为了答谢大家多年来的支持厚爱,也为了更广泛的推广VBA应用,“VBA语言専攻”在春节期间再次推出钜惠活动,时间2月9日到2月17日(大年三十到正月初八) 1 &…
最新文章