ChatGPT自动化编程:用PyQt6实现滑块设置背景色
蒙娜丽宁
2023年12月25日 14:40
收录于文集
共7篇

     如果需要使用ChatGPT Plus账号,建议使用虚拟信用卡,推荐使用https://bewildcard.com,支持美国本地环境,升级ChatGPT Plus、OpenAI API、midjourney等可100%成功,输入推荐码SUCCESS,开卡费88折。使用https://bewildcard.com/i/SUCCESS可直接输入推荐码! 

  有很多编程语言都支持GUI,如Python的PyQt、Tkinter、wxPython、C++的QT、Java的JavaFX、JavaScript的Electron、C#的各种GUI框架等。如果读者像在不同的操作系统上使用不同的编程语言开发GUI应用,或者处于不同的目的,要使用不同编程语言开发满足特定目的的GUI应用,并且人手不够的话,那么恐怕就要996了,有时不急007都不够。但有了ChatGPT、GitHub Copilot这些超强的AI工具,就很爽了,一个人就是一个团队,而且是顶级的团队。

   本文会结合多种AI代码生成工具,向读者展示如何利用这些工具在极短的时间内,快速、准确地完成一个GUI应用。这个GUI应用的基本功能是通过3个滑块组件控制颜色的红、绿、蓝三原色,然后将颜色作为文本框的背景色,并将颜色值显示在标签组件上。这个程序我们先用Python和PyQt6实现。所以读者需要安装Python,并使用下面的命令安装PyQt6。

pip install PyQt6

根据这个桌面应用的功能描述,可以得出下面的几个关键点:

(1)窗口

(2)文本框组件

(3)标签组件

(4)3个滑块组件

(5)每个滑块组件都可以响应滑块的滑动动作

那么就将这几个关键点组合起来,形成一段文字,然后扔给ChatGPT,于是有了下面的描述:

用PyQt6创建一个300*500的窗口,然后在窗口的垂直方向分别放置一个文本组件、一个标签组件和3滑块组件。所有滑块组件的最小值是0,最大值是255。3个滑杆组件分别作为红、绿、蓝三原色。当滑动这3个滑块时,分别用这3个滑块的当前值设置文本组件的背景色。然后将这3个滑块的当前值组合成以井号开头的颜色值,如#ffffff,显示在标签组件中。给出完整的实现代码和中文注释。

ChatGPT会给出下面的代码:

import sys

from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QSlider, QTextEdit

from PyQt6.QtCore import Qt

from PyQt6.QtGui import QColor

class ColorSliderApp(QWidget):

def __init__(self):

super().__init__()

# 设置窗口大小

self.resize(300, 500)

# 设置布局

self.layout = QVBoxLayout()

self.setLayout(self.layout)

# 创建文本组件

self.text_edit = QTextEdit()

self.layout.addWidget(self.text_edit)

# 创建标签组件

self.label = QLabel("颜色: #ffffff")

self.layout.addWidget(self.label)

# 创建滑杆组件

self.red_slider = QSlider(Qt.Orientation.Vertical)

self.green_slider = QSlider(Qt.Orientation.Vertical)

self.blue_slider = QSlider(Qt.Orientation.Vertical)

# 设置滑块范围

self.red_slider.setRange(0, 255)

self.green_slider.setRange(0, 255)

self.blue_slider.setRange(0, 255)

# 添加滑块到布局

self.layout.addWidget(self.red_slider)

self.layout.addWidget(self.green_slider)

self.layout.addWidget(self.blue_slider)

# 连接滑块信号到槽函数

self.red_slider.valueChanged.connect(self.update_color)

self.green_slider.valueChanged.connect(self.update_color)

self.blue_slider.valueChanged.connect(self.update_color)

def update_color(self):

# 获取滑块的值

red = self.red_slider.value()

green = self.green_slider.value()

blue = self.blue_slider.value()

# 设置文本组件的背景色

color = QColor(red, green, blue)

self.text_edit.setStyleSheet(f"background-color: {color.name()}")

# 设置标签组件显示的颜色值

self.label.setText(f"颜色: {color.name()}")

if __name__ == "__main__":

app = QApplication(sys.argv)

# 创建窗口实例

window = ColorSliderApp()

window.show()

    sys.exit(app.exec())

运行这段代码,会显示如下图所示的效果。

初步生成的桌面应用

 从展示的窗口和组件来看,功能基本上没问题,但界面看着别扭。由于在描述中没有说清楚滑块组件的方向,所以ChatGPT自作主张将滑块方向设置成垂直方向。当然,可以要求ChatGPT重新生成这段程序,不过没有必要,这些都是小问题,只要微调即可。

  现在就将所有的滑块组件变成水平方向,如果读者第1次使用QSlider组件,不知道如何设置QSlider组件为水平方向,那么就可以借助GitHub Copilot或其他同类工具。首先在__init__方法中创建QSlider组件代码的后面添加如下注释:

# 将red_slider、green_slider和blue_slider设置为水平方向

然后不断按Enter和Tab键,就会一行一行自动生成如下的3行代码:

self.red_slider.setOrientation(Qt.Orientation.Horizontal)

self.green_slider.setOrientation(Qt.Orientation.Horizontal)

self.blue_slider.setOrientation(Qt.Orientation.Horizontal)

再次运行程序,会看到如下图所示的效果。

将滑块组件变为水平方向

 不过这个程序仍然不完美,3个滑块组件到底是做什么的呢?除了自己,没人知道。所以需要继续改进这个程序。在每一个滑块组件前面加一个标签,用于表明对应滑块组件的作用,所以可以在创建QSlider组件代码的后面添加下面的注释:

# 分别在red_slider、green_slider和blue_slider前面各添加一个标签组件,用于显示滑块的值

然后不断按Enter和Tab键,GitHub Copilot会自动生成如下的代码:

self.red_label = QLabel("R")

self.green_label = QLabel("G")

self.blue_label = QLabel("B")

self.layout.addWidget(self.red_label)

self.layout.addWidget(self.red_slider)

self.layout.addWidget(self.green_label)

self.layout.addWidget(self.green_slider)

self.layout.addWidget(self.blue_label)

self.layout.addWidget(self.blue_slider)

 在这段代码中,重复添加了3个滑块组件,所以需要将后面添加3个滑块的代码去掉,要去掉的代码如下:

self.layout.addWidget(self.red_slider)

self.layout.addWidget(self.green_slider)

self.layout.addWidget(self.blue_slider)

现在运行程序,会看到如下图所示的效果。

添加标签组件

  现在的程序虽然比刚开始好多了,但仍然不完美。尽管知道了每一个滑块组件是做什么的,但不知道每一个滑块组件的当前值,所以希望在每一个滑块组件上方的标签组件中,不仅显示标识,还显示对应滑块的当前值。

在update_color获取滑块组件值代码的后面输入如下的注释:

# 将每一个滑块组件的当前值显示在对应的标签组件上,并且在对应的标签组件前面显示“红:”、“绿:”、“蓝:”等文本

  然后不断按Enter和Tab键,会生成如下的代码:

self.red_label.setText(f"红: {red}")

self.green_label.setText(f"绿: {green}")

self.blue_label.setText(f"蓝: {blue}")

   如果生成的代码仍然用R、G、B表示红、绿、蓝,直接手动改一下即可。然后在__init__方法的最后使用下面的代码调用update_color方法,以保证在窗口启动时也可以更新3个标签组件的值。

self.update_color()

现在运行程序,会看到如下图所示的窗口。

  当然,这个程序还有改进空间,读者可以自行发挥想象力,看看还有哪些地方需要完善。