将桌面应用转换为Web应用——AIGC自动化编程(12)

发表于:2023-11-14 09:27

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李宁    来源:51Testing软件测试网原创

#
AI
  5.2  将桌面应用转换为Web应用
  ChatGPT的另一个重要的用途就是解决方案的转换,这不是简单的程序之间的转换,例如,将Python版的冒泡排序算法程序转换成JavaScript版的冒泡排序算法程序。这非常简单,GitHub Copilot以及很多AI工具能做到。但如果实现解决方案的转换,可能并不是输入一个程序、输出多个程序这么简单,甚至可能输入一个程序、输出多个程序,或者是多输入、多输出。本节会将第4章用Python实现的两个桌面应用直接转换为Web应用,而且不需要修改任何代码。
  5.2.1  Web版滑块设置背景色
  在4.1节中,我们基于PyQt6实现了一个使用滑块组件设置文本输入框背景色的应用,如果出于某种原因,可能是要给客户演示一下程序的运行效果,不方便直接用桌面应用,也可能需要实现一个同样功能的Web版的应用。在这种情况下,通常的做法就是让Web程序员根据用PyQt6实现的桌面应用的功能重新实现一遍。如果再加一个限制条件,要求你在1min内搞定这件事,你肯定在想,找外星人做吧。不过,ChatGPT能在1min之内实现一个完整的Web应用,而且实现的功能基本上是正确的。当然,这可能需要微调,微调的任务就交给GitHub Copilot来做吧!
  尽管GitHub Copilot和GitHub Copilot Labs也可以转换程序,但只能一对一地转换,没有办法一对多,更没有办法多对多,所以在这种情况下,只能使用ChatGPT。
  让ChatGPT转换程序要比直接让ChatGPT编写程序简单得多。只需要告诉ChatGPT要将当前程序转换成什么语言的程序即可,ChatGPT会自己分析,并找到目标语言与源语言对应的API以及特定的解决方案。下面就是给ChatGPT提供的文本。
  下面是基于Python和PyQt6实现的用滑块组件设置文本输入框背景色的程序,将这段程序转换为用HTML、CSS
      和JavaScript实现的Web应用。.css文件用color_slider.css,.js文件用color_slider.js。
  import sys
  from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QSlider, 
      QTextEdit
  from PyQt6.QtCore import Qt
  from PyQt6.QtGui import QColor
  ... 
  # 这里应该是完整的实现代码
  读者在提交上述文本时,应该复制用PyQt6实现的应用的所有代码,本例中省略了PyQt6版本的大多数代码。
  ChatGPT会根据上述的文本,生成.html文件、.css文件和.js文件对应的代码。
  HTML代码如下。
  代码位置:src/web/color_slider.html
  <!DOCTYPE html>
  <html lang="zh-CN">
  <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>颜色滑动选择器</title>
      <link rel="stylesheet" href="color_slider.css">
  </head>
  <body>
      <div class="app-container">
           <div id="color-display" class="color-display"></div> 颜色展示区域
          <!-- 如何将color-display变为可输入的-->
          <!-- 颜色信息标签 -->
          <div id="color-label" class="color-label">颜色: #ffffff</div>
          <!-- 红色滑块 -->
          <label id="red-label" class="slider-label">红: 0</label>
          <input id="red-slider" type="range" min="0" max="255" value="255" class
                                                                         ="slider">
          <!-- 绿色滑块 -->
          <label id="green-label" class="slider-label">绿: 0</label>
          <input id="green-slider" type="range" min="0" max="255" value
                                                       ="255" class="slider">
          <!-- 蓝色滑块 -->
          <label id="blue-label" class="slider-label">蓝: 0</label>
          <input id="blue-slider" type="range" min="0" max="255" value
                                                              ="255" class="slider">
      </div>
      <!-- 引入JavaScript -->
      <script src="color_slider.js"></script>
  </body>
  </html>
  CSS代码如下。
  代码位置:src/web/color_slider.css
  body, html {
      height: 100%;
      margin: 0;
      display: flex;
      justify-content: center;
      align-items: center;
      background-color: #f2f2f2;
  }
  .app-container {
      text-align: center;
  }
  .color-display {
      width: 150px;
      height: 150px;
      margin: 10px auto;
      background-color: #ffffff;
  }
  .color-label {
      margin: 10px;
      font-size: 16px;
  }
  .slider-label {
      display: block;
      margin: 10px;
  }
  .slider {
      width: 200px;
      margin: 10px auto;
  }
  JavaScript代码如下。
  代码位置:src/web/color_slider.js
  const redSlider = document.getElementById('red-slider');
  const greenSlider = document.getElementById('green-slider');
  const blueSlider = document.getElementById('blue-slider');
  const redLabel = document.getElementById('red-label');
  const greenLabel = document.getElementById('green-label');
  const blueLabel = document.getElementById('blue-label');
  const colorDisplay = document.getElementById('color-display');
  const colorLabel = document.getElementById('color-label');
  // 为滑块添加输入事件监听
  redSlider.addEventListener('input', updateColor);
  greenSlider.addEventListener('input', updateColor);
  blueSlider.addEventListener('input', updateColor);
  function updateColor() {
      // 获取滑块的值
      const red = redSlider.value;
      const green = greenSlider.value;
      const blue = blueSlider.value;
      // 更新标签文本
      redLabel.textContent = '红: ${red}';
      greenLabel.textContent = '绿: ${green}';
      blueLabel.textContent = '蓝: ${blue}';
      // 更新颜色展示区域和颜色信息标签
      const color = 'rgb(${red}, ${green}, ${blue})';
      colorDisplay.style.backgroundColor = color;
      colorLabel.textContent = '颜色: ${rgbToHex(red, green, blue)}';
  }
  // 将RGB转换为十六进制
  function rgbToHex(r, g, b) {
      return "#" + ((1 << 24) + (parseInt(r) << 16) + (parseInt(g) << 8) 
                                  + parseInt(b)).toString(16).slice(1);
  }
  在浏览器中打开color_slider.html页面,会看到图5-4所示的效果。
图5-4  Web版滑块的效果
  我们可以在图5-4上滑动3个滑块组件,图5-4中的颜色展示区域的背景色会随着3个滑块组件的移动而变化。但颜色值在变化时有如下两个小瑕疵。
  颜色展示区域使用的是<div>标签,无法编辑,但用PyQt6实现的应用使用了文本输入框组件,可以编辑。
  “红”“绿”“蓝”文字水平居中显示,而用PyQt6实现的应用在左侧显示。
  尽管这两处瑕疵并不影响程序的核心功能,但为了追求与用PyQt6实现的应用的功能和样式尽可能相同,下面将使用GitHub Copilot对ChatGPT生成的代码进行微调。
  1.把颜色展示区换成文本输入框
  其实把颜色展示区换成文本输入框很简单,只需要将<div>标签换成<input>标签即可。当然,使用GitHub Copilot自动生成也可以。首先,在color_slider.html文件中,找到下面的代码。
  <div id="color-display" class="color-display"></div>
  然后,在这行代码下面,输入如下注释。
  <!—如何将color-display变为可输入的-->
  不断按Enter键和Tab键,GitHub Copilot会自动生成如下代码,可以自己替换value的值,如换成“颜色展示区”。
  <input id="color-display" class="color-display" type="text" value="#ffffff">
  最后,将<div>标签后面的“颜色展示区域”文字去掉。
  2.颜色值左对齐
  在color_slider.html文件中,找到如下代码。
  <label id="red-label" class="slider-label">红: 0</label>
  然后,在这行代码下方,输入如下注释。
  <!-- 让red-label中的文字左对齐 -->
  不断按Enter键和Tab键,GitHub Copilot会生成如下代码。
  <label id="red-label" class="slider-label" style="text-align:left">红: 0</label>
  对于绿色和蓝色,也按这个方法处理。现在刷新页面,会得到完善后的效果,如图5-5所示。
图5-5  改善后的Web版滑块的效果
版权声明:51Testing软件测试网获得作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号