C#实例:多功能Windows窗体应用程序Helloworld_WinForm

news2024/11/24 20:47:33

有了创建一个Windows窗体应用程序的经验,就可以开始尝试运用更多的控件实现更多丰富的功能界面。以下分享我基于项目Helloworld_WinForm使用常用C#Windows窗体控件实现一些小功能。

每一节标题为所用到的控件,全文以实际制作过程为序编制。


目录

  • WinForm窗体应用程序开发步骤
  • 常用控件实例
    • MenuStrip 菜单栏
    • richTextBox富文本框
    • SaveFileDialog保存对话框
    • FontDialog字体对话框
    • richTextBox的属性WordWrap
    • ColorDialog颜色对话框
    • Timer计时器
    • PictureBox-如何加文字
    • PictureBox-画图
  • 问题与解决
    • 解决子窗体被父窗体控件挡住问题
  • 发布做好的程序


WinForm窗体应用程序开发步骤

1、创建窗体Form

项目创建时会默认创建一个窗体,默认为父窗体。
新建的其他窗体为子窗体,子窗体调用时会在父窗体中显示。
项目创建方法见:Helloworld_WinForm,本文直接基于之前创建的项目搭建功能。

2、创建控件Control

控件显示在工具箱中,通过双击或拖拽的方式显示在当前打开的设计窗口中,可在属性栏修改其属性。

3、指定布局Layout

根据应用拖动控件位置,或在属性中调整坐标等。

4、响应事件Event

事件包括双击控件、按下鼠标、向文本框输入内容等等,可以在控件属性中点击事件图标查看所有事件。
响应是指发生事件后,触发的操作,通常以代码的形式实现功能。

描述还是比较抽象,建议动手实践。

常用控件实例

MenuStrip 菜单栏

新建MenuStrip控件,修改属性如下

  • Name:tools
  • Text:工具
    在工具下,继续新建TextBox,修改它们属性的Text。

如果在子窗体中也加入Menustrip,则需在父窗体的Menustrip属性中按下图所示修改,否则子窗体菜单栏不会显示出来,默认二者菜单栏合并。
在这里插入图片描述
父窗体:
在这里插入图片描述
子窗体:
在这里插入图片描述

richTextBox富文本框

参考链接
在项目中右键添加子窗体,命名Text。
Anchor属性选择“Top,Bottom,Left,Right”,这样当窗体大小改变时,RichTextBox控件的大小也会跟着改变
在这里插入图片描述

新建 richTextBox控件。属性BackColor改为ControlLightLiight,ReadOnly改为True。修改Dock属性为Fill,使控件铺满窗口。
在这里插入图片描述

将父窗体属性中的IsMdiContainer改为true。
并双击父窗体菜单栏的“新建”,编辑程序,使点击新建时打开子窗体。

private void toolStripTextBox3_Click(object sender, EventArgs e)
        {
            Text newMDIChild = new Helloworld_WinForm.Text();
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            // Display the new form.
            newMDIChild.Show();
        }

SaveFileDialog保存对话框

参考链接:c#保存textbox中的字符串到txt文件中
点击记事本的【文件】→【保存】菜单项时,使用SaveFileDialog保存文件。

用程序创建SaveFileDialog及修改属性。

		// 菜单栏中的保存按钮。也可用Button
		private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
        {
        	// 新建SaveFileDialog,Name为saveFileDialog
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            // 修改属性,定义保存文件类型
            saveFileDialog.Filter = "(*.txt)|*.txt|(*.*)|*.*|97-2003Word文档|*.doc";
            // 文件名是日期时间
            saveFileDialog.FileName = "D:\\text\\" + DateTime.Now.ToString("yyyyMMddHHmm") + ".txt";
            // 对话框打开
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
            	// 新建数据流
                StreamWriter streamWriter = new StreamWriter(saveFileDialog.FileName, true);
                // 写入数据
                streamWriter.Write(this.richTextBox1.Text);
                // 关闭当前streamWriter对象和基础流
                streamWriter.Close();
            }
        }

		// 富文本,Name为richTextBox1
        private void richTextBox1_TextChanged_1(object sender, EventArgs e)
        {

        }

上述程序启动后,点击保存,会弹出保存窗口,如下:
在这里插入图片描述
可以选择保存为txt或doc格式。

试一试效果:
在这里插入图片描述

FontDialog字体对话框

继续增加菜单栏选项:字体。其属性Name为字体ToolStripMenuItem。
在这里插入图片描述
双击字体,编写代码,新建字体对话框,并将设置的字体赋给富文本中的Text。

		private void 字体ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FontDialog fontDialog = new FontDialog();
            if(fontDialog.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.SelectionFont = fontDialog.Font;
            }
        }

试一下效果:
先设置字体,再输入文本。也可在输入文本后,选中需要修改字体的文本,再点击字体修改。
在这里插入图片描述
在这里插入图片描述

richTextBox的属性WordWrap

增加菜单栏选项:自动换行。其Name属性为自动换行ToolStripMenuItem。

自动换行的Checked属性默认为“False”,文本内容按照文本框的宽度自动换行,否则只按段落标记换行。

可以修改富文本属性WordWrap,以决定是否默认自动换行,此处为默认自动换行:
在这里插入图片描述
将自动换行选项的默认状态Checked改为被点击的True状态:
在这里插入图片描述
双击自动换行,编辑代码如下:

        private void 自动换行ToolStripMenuItem_Click(object sender, EventArgs e)
        {
        	// 判断自动换行状态标记
            if(自动换行ToolStripMenuItem.Checked == false)
            {
            	// 被按下后更新状态
                自动换行ToolStripMenuItem.Checked = true;
                // 自动换行
                richTextBox1.WordWrap = true;
            }
            else
            {
            	// 被按下后更新状态
                自动换行ToolStripMenuItem.Checked = false;
                // 不自动换行
                richTextBox1.WordWrap = false;
            }
        }

实现的效果就是默认自动换行,点击自动换行后取消自动换行,再次点击则变为自动换行。

ColorDialog颜色对话框

利用ColorDialog修改字体颜色。
增加菜单栏字体颜色,其Name属性为字体颜色ToolStripMenuItem。

双击它编辑代码如下:

// 第一种
		private void 字体颜色ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ColorDialog colorDialog = new ColorDialog();
            if (colorDialog.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.SelectionColor = colorDialog.Color;
            }
        }

试一下效果:
若先设置字体颜色,再输入文本,则此前输入的文本不会变化,变更只适用于此后输入的文本。
也可在输入文本后,选中需要修改字体颜色的文本,再点击字体颜色修改,变更适用于选中的文本。
在这里插入图片描述
修改为橙色:
在这里插入图片描述

如果在未选中文本时修改字体颜色,要将所有文本字体颜色同时修改,则可以这样写:
选中文本再修改颜色,只会修改选中文本的颜色。

// 第二种
		private void 字体颜色ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ColorDialog colorDialog = new ColorDialog();
            if (this.colorDialog1.ShowDialog() == DialogResult.OK)
            {
                if (this.richTextBox1.SelectedText == "") // 若未选中文本,则将设置颜色适用于所有文本
                {
                    this.richTextBox1.ForeColor = this.colorDialog1.Color;
                }
                else
                {
                    this.richTextBox1.SelectionColor = this.colorDialog1.Color;
                }
            }
        }

Timer计时器

参考链接
在项目中新建Windows窗体,命名为Clock.cs。
在父窗体中,双击菜单栏Clock,编写代码,添加子窗体Clock。属性BackColor改为ControlLightLiight,ReadOnly改为True。
代码如下:

		private void toolStripTextBox2_Click(object sender, EventArgs e)
        {
            Clock newMDIChild = new Helloworld_WinForm.Clock();
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            // Display the new form.
            newMDIChild.Show();
        }

在Clock窗体中,拖拽Label控件,Name为label1,修改属性字体颜色为喜欢的字体。修改属性Text为yyyy-MM-dd HH:mm:ss。
在这里插入图片描述
拖拽Timer计时器控件,Name为timer1,修改属性Enable为True,Interval为1000。使能定时,每1000ms执行一次函数timer1_Tick中的内容。
在这里插入图片描述
双击timer1,编写代码,使其显示实时时间。

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");  //年-月-日 小时:分钟:秒
        }

其中,HH为24小时进制,hh为12小时进制。

让Label文字居中的方法:设置Autosize的值为false,拉大这个label框的宽度,设置label属性里的TextAlign为MiddleCenter,意思是让框里的文字内容居中。
在这里插入图片描述
启动后效果如下:每过一秒,时间更新一次。
在这里插入图片描述

PictureBox-如何加文字

参考链接
在父窗口的菜单栏工具中添加一项:Panel。并添加子菜单 加水印 和 清屏。本节实现加水印的功能,后一节实现清屏。
在这里插入图片描述

从工具箱拖拽一个PictureBox控件到窗口,属性Dock改为Fill。
属性BackgroundImage可以上传一个图片,使PictureBox控件区域默认显示该图片。
还有SizeMode属性选Zoom,SizeMode属性包含:

  • Normal:图片大小不变;
  • strechImage:拉伸图片适应PictureBox(图片会变形)
  • AutoSize:PictureBox适应图片;
  • CenterImage:图片居中显示;
  • Zoom:图片填充PictureBox(不变形)

双击“加水印”,编辑程序如下:实现将文字显示在对应坐标。

		private void 加水印ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 在pictureBox上创建画图板
            Graphics g = pictureBox1.CreateGraphics();
            // 设置字体的样式
            Font f = new Font("黑体", 24);
            // 实例化一个实心画刷,颜色是白色
            SolidBrush brush = new SolidBrush(Color.White);
            // 与左上角坐标的距离
            PointF point = new PointF(400, 300);
            // 开始绘制
            g.DrawString("From: Electrical_IT", f, brush, point);
        }

启动运行,点击加水印,效果如下:
在这里插入图片描述

PictureBox-画图

参考链接:C#控件picturebox实现画图功能
C#控件画图方法
打开指定路径图片的方法
本部分实现鼠标在PictureBox区域中使用鼠标绘制的功能。
PictureBox控件属性设置参考上一节。菜单栏也如上一节添加。

要实现绘图功能,需要用到PictureBox的事件响应,位置在PictureBox的属性框中,点击PictureBox,点击事件图标即可看到:
在这里插入图片描述
重命名事件MouseDown为drawstart,事件MouseMove为drawmove,事件MouseUp为drawstop。
每次命名后会自动切换到代码编辑界面。

修改代码如下:

        private void 清屏ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();
            // 用原背景图清屏
            g.DrawImage(pictureBox1.BackgroundImage, 0, 0);
        }

        // 定义鼠标绘制的终点(起点永远是鼠标当前坐标)
        private Point endpoint;
        // 绘制标志
        private static bool drawing = false;
        private void drawstart(object sender, MouseEventArgs e)
        {
            // 创建终点
            endpoint = new Point(e.X, e.Y);
            // 鼠标按下开始绘制
            drawing = true;
        }

        private void drawstop(object sender, MouseEventArgs e)
        {
            // 鼠标松开结束绘制
            drawing = false; 
        }

        private void drawmove(object sender, MouseEventArgs e)
        {
            // 鼠标移动进行绘制,创建画布
            Graphics g = pictureBox1.CreateGraphics();
            // 显示时消除锯齿
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            // 如果鼠标按下的按钮是左键
            if(e.Button == MouseButtons.Left)
            {
                if(drawing)
                {
                    // 当前坐标
                    Point currentpoint = new Point(e.X, e.Y);
                    // 用白蓝色笔绘制连接p2和当前坐标的线
                    g.DrawLine(new Pen(Color.AliceBlue, 2), endpoint, currentpoint);
                    // 更新终点坐标
                    endpoint.X = currentpoint.X;
                    endpoint.Y = currentpoint.Y;
                }
            }
        }

用鼠标画一画,绘制效果如下:
在这里插入图片描述
点击清屏后效果如下:(清屏也会把水印清掉)
在这里插入图片描述
如果清屏想用白色清屏,参考以下代码:

		private void 清屏ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();
            g.Clear(Color.White);
        }

问题与解决

解决子窗体被父窗体控件挡住问题

上述实例先创建了子窗体Hello、Clock和Text,再在父窗体中添加了控件PictureBox。
启动后,点击菜单栏Hello、Clock和文件新建时,子窗体无法显示在PictureBox控件前,原因是被父窗口的控件挡住了。

我的解决方法是在打开子窗体前,将父窗体中的控件PictureBox隐藏,点击Panel后再显示PictureBox控件。

隐藏:pictureBox1.Hide();
显示:pictureBox1.Show();

首先将HelloWorld.cs中,菜单点击事件的响应程序里添加隐藏控件的函数:

		 private void toolStripTextBox1_Click(object sender, EventArgs e)
        {
            Hello newMDIChild = new Helloworld_WinForm.Hello();
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            // Hide the pictureBox1
            pictureBox1.Hide();
            // Display the new form.
            newMDIChild.Show();
        }

        private void toolStripTextBox3_Click(object sender, EventArgs e)
        {
            Text newMDIChild = new Helloworld_WinForm.Text();
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            //Hide the pictureBox1
            pictureBox1.Hide();
            // Display the new form.
            newMDIChild.Show();
        }

        private void toolStripTextBox2_Click(object sender, EventArgs e)
        {
            Clock newMDIChild = new Helloworld_WinForm.Clock();
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            //Hide the pictureBox1
            pictureBox1.Hide();
            // Display the new form.
            newMDIChild.Show();
        }

其次,在点击菜单中需要响应主窗口控件pictureBox1的程序中,增加显示控件函数:

		private void 加水印ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 设置字体的样式
            Font f = new Font("黑体", 24);
            // 实例化一个实心画刷,颜色是白色
            SolidBrush brush = new SolidBrush(Color.White);
            // 与左上角坐标的距离
            PointF point = new PointF(400, 300);
            // 显示pictureBox1控件
            pictureBox1.Show();
            // 在pictureBox上创建画图板
            Graphics g = pictureBox1.CreateGraphics();
            // 开始绘制
            g.DrawString("From: Electrical_IT", f, brush, point);
        }

        private void 清屏ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 显示pictureBox1控件
            pictureBox1.Show();
            Graphics g = pictureBox1.CreateGraphics();
            // 用原背景图清屏
            g.DrawImage(pictureBox1.BackgroundImage, 0, 0);
        }

测试后发现还一个问题:pictureBox1被隐藏后,点击菜单中的加水印,会显示pictureBox1控件背景,但不会显示水印,还需要第二次点击,才会显示水印。不清楚为什么,还希望有大神评论指点。

另外,如果主窗口中控件非常多,不建议使用这种方式,建议将主窗口的控件放在Panel控件中,使子窗口的父类设置为Panel。参考链接

发布做好的程序

如果想将程序发给朋友玩一下,就需要发布。

首先,配置设置为Release、Any CPU。
在这里插入图片描述
找到生成,点击发布。
在这里插入图片描述
根据发布向导,指定发布的位置。
在这里插入图片描述
选择用户下载的方式,这里选从ROM。
在这里插入图片描述
选择不检查更新,并点击完成。
在这里插入图片描述
等待片刻,就可以在路径里找到setup.exe安装包。双击运行,就可以得到应用配置文件夹和应用程序。双击Helloworld_WinForm.application就可以运行了。
在这里插入图片描述
如果想卸载,可以在控制面板的应用中找到并卸载它。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Explorer.exe系统错误,电脑重启后刚开始一段时间正常,过一会桌面任务栏就卡死,可以打开任务管理器

环境: 联想E14 Win10专业版 问题描述: 1.重启系统后刚开始一段时间点击任务栏正常,过一会桌面任务栏就卡死,可以打开任务管理器,任务管理器查看shell infrastructure占用cpu比较多,网上说是微软图片查看软件导致,重置改了默认照片查看器,恢复这个应该不是主要原因 …

数组题目总结 -- 随机数问题

目录 一. O(1) 时间插入、删除和获取随机元素思路和代码:I. 博主的做法II. 东哥的做法III. 其他做法 二. 黑名单中的随机数思路和代码:I. 博主的做法II. 东哥的做法 一. O(1) 时间插入、删除和获取随机元素 题目链接:https://leetcode.cn/pr…

如何提升邮件点击率?诀窍速递

相比邮件的打开率,邮件点击率可以更好地评估邮件营销的表现,帮助营销人员评估营销活动是否有帮助推动销售、培养潜在客户或提升品牌知名度等。如何更好地提升电子邮件的点击率,本文6个小贴士来助力。 这里给大家推荐一站式客服系统SaleSmartl…

芒种忙什么呢?当然是抢个中国人民大学与加拿大女王大学金融硕士项目的入学名额了

今日是农历的芒种,大家都在忙什么呢?“芒种”一词最早出自《周礼》中的“泽草所生,种之芒种。”其中“芒”指的是在阳光照耀下如波浪般摇摆的麦芒,表明此时已经成熟可以收割了。而“种”则代表稻谷,这时候是种稻谷的最…

066:cesium flyto一个具体的点位置

第066个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置飞行定位功能,如果你知道位置的经纬度和高度,你可以使用相机的 flyTo 函数直接飞到 CesiumJS 中的那个位置。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式…

【数据存储:揭开内存中数据存储的神秘面纱】

本节重点 -- 重中之重 数据类型详细介绍 整形在内存中的存储:原码、反码、补码 大小端字节序介绍及判断 浮点型在内存中的存储解析 准备好了,开始啰,在小小的花园里面......最近被这个歌曲洗脑,但是我们并不是要唱歌,而…

分布式数据库HBase

大数据基础-分布式数据库HBase 概述HBase简介HBase与传统关系数据库的对比分析 HBase数据模型数据模型概述数据模型相关概念数据坐标 HBase的实现原理HBase功能组件表和RegionRegion的定位HBase框架结构HMasterRegionServerHBase协作组件RegionColumnFamilyKeyValue小结 HBase运…

Vue基础第四篇

一、计算属性 计算属性是基于它们的依赖进行缓存的 计算属性只有在它的相关依赖发生改变时才会重新求值 计算属性就像Python中的property&#xff0c;可以把方法/函数伪装成属性 1.通过计算属性实现名字首字母大写 <!DOCTYPE html> <html lang"en">…

k8s入门(三)之StatefulSet、Service、Ingress

一、StatefulSet操作 – 1、初体验 可以发现等待前一个启动好了&#xff0c;在启动下一个&#xff0c;因此容器的健康检查失败也会影响启动 域名&#xff1a;web-2.nginx.default.svc.cluster.local,一般写到web-2.nginx.default就可以了 [rootmaster01 ~]# cat ssweb.yaml a…

2023 年 10 个最佳 Java IDE 和编辑器

集成开发环境或 IDE 是构建软件项目所需的最关键部分之一。它们使开发变得简单高效。 IDE 通过缩短设置时间、加速开发任务、让开发人员了解最新的危险和最佳实践以及标准化开发过程以便任何人都可以参与来提高开发人员的生产力。 IDE 还可以帮助重构开发过程。它们使程序员能…

HTTP请求报文解剖

HTTP请求报文解剖 HTTP请求报文由3部分组成&#xff08;请求行请求头请求体&#xff09;&#xff1a; 下面是一个实际的请求报文&#xff1a; ①是请求方法&#xff0c;GET和POST是最常见的HTTP方法&#xff0c;除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过&#…

Thread 类基本用法详解

Thread 类基本用法详解 Thread类的作用线程创建继承 Thread, 重写 run实现 Runnable, 重写 run继承 Thread, 重写 run, 使用匿名内部类实现 Runnable, 重写 run, 使用匿名内部类使用 lambda 表达式(最推荐) 线程中断1.使用标志位来控制线程是否要停止2.使用Thread自带的标志位来…

软件测试商城项目----优惠券测试流程

优惠券冒烟测试 后台添加优惠券&#xff0c;前端领取&#xff0c;消费并成功扣除对应金额&#xff0c;如果冒烟测试不通过不进行下面的测试。 优惠券基本信息测试 &#xff08;1&#xff09;优惠券名称 &#xff08;2&#xff09;优惠券副标题 &#xff08;3&#xff09;优惠券…

ubuntu2204server虚拟机创建

ubuntu2204 虚拟机创建系统安装系统配置 虚拟机创建ubuntu2204&#xff0c;然后配置清华源&#xff0c;修改网卡已经ssh文件&#xff0c;实现远程连接 虚拟机创建 一路回车默认到创建磁盘 一路回车到自定义硬件 添加一块网盘&#xff0c;其他的是否添加自己根据实际情况&…

【C刷题笔记】找单身狗问题

目录 版本1:在数组内只有一个元素没有成对出现 版本2:在数组内有两个元素没有成对出现 第一步:异或所有元素,异或就是相同为0&#xff0c;相异为1 第二步:计算ret的二进制中哪一位元素是1 第三步:开始分组异或 1.分组: 2.异或 版本1:在数组内只有一个元素没有成对出现 单…

基于C/C++将派生类赋值给基类的详细讲解

目录 将派生类对象赋值给基类对象 将派生类指针赋值给基类指针 将派生类引用赋值给基类引用 本期推荐书目 在 C/C中经常会发生数据类型的转换&#xff0c;例如将 int 类型的数据赋值给 float 类型的变量时&#xff0c;编译器会先把 int 类型的数据转换为 float 类型再赋值&a…

华为OD机试 Java 实现【查找兄弟单词】【牛客练习题 HJ27】,附详细解题思路

一、题目描述 定义一个单词的“兄弟单词”为&#xff1a;交换该单词字母顺序&#xff08;注&#xff1a;可以交换任意次&#xff09;&#xff0c;而不添加、删除、修改原有的字母就能生成的单词。 兄弟单词要求和原来的单词不同。例如&#xff1a; ab 和 ba 是兄弟单词。 ab …

三防工业平板电脑搭载大容量聚合物锂电池,满足全天候移动式作业

在制造业、物流业等行业中&#xff0c;电脑经常会接触到水&#xff0c;因此防水是非常重要的。工业三防平板电脑采用了特殊的防水技术&#xff0c;能够在水中工作&#xff0c;即使在雨天或水花溅到电脑上时也不会受到损坏。 三防工业平板电脑采用8核ARM架构处理器&#xff0c;2…

QML开发避坑指南(四):ImageProvider的使用

&#xff08;1&#xff09;引子 首先&#xff0c;ImageProvider是为QML应用提供的、一种先进的图像加载方式。 作者建议从三点理解其定义&#xff1a; 加载方式的差异&#xff1a; 相比本地资源的加载方式&#xff1a;source : “qrc:///前缀/demo.jpg”。 ImageProvider方式…

使用 ChatGPT API 构建系统(三):思维链推理

今天我学习了DeepLearning.AI的 Building Systems with the ChatGPT API 的在线课程&#xff0c;我想和大家一起分享一下该门课程的一些主要内容。 下面是我们通过Open API来访问ChatGPT模型的主要代码&#xff1a; import openai#您的openai的api key openai.api_key YOUR-O…