pyqt创建两个窗口,主窗口有两个pushbutton和两个combobox控件,combobox1可以下拉选择串口号,combobox2可以选择波特率。串口号通过函数检索生成。点击pushbutton1连接串口,点击pushbutton2进入新的窗口,新的窗口有一个关闭按钮,点击按钮可以关闭新窗口
时间: 2024-04-23 08:22:32 浏览: 104
好的,这是一个比较复杂的问题,需要一步一步来实现。首先,需要导入PyQt5库和serial库,serial库可以用来连接串口。
```python
import sys
import serial
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QComboBox, QVBoxLayout, QHBoxLayout, QLabel
```
然后,我们创建一个主窗口,里面包含两个PushButton和两个ComboBox。
```python
class MainWindow(QWidget):
def __init__(self):
super().__init__()
# 创建串口列表
self.serial_list = self.get_serial_list()
# 创建控件
self.serial_port_combo = QComboBox()
self.baud_rate_combo = QComboBox()
self.connect_button = QPushButton("连接串口")
self.new_window_button = QPushButton("打开新窗口")
# 将串口列表添加到串口选择框中
self.serial_port_combo.addItems(self.serial_list)
# 将波特率添加到波特率选择框中
self.baud_rate_combo.addItems(["9600", "115200"])
# 创建布局
vbox = QVBoxLayout()
hbox1 = QHBoxLayout()
hbox2 = QHBoxLayout()
# 将控件添加到布局中
hbox1.addWidget(QLabel("串口号:"))
hbox1.addWidget(self.serial_port_combo)
hbox1.addWidget(QLabel("波特率:"))
hbox1.addWidget(self.baud_rate_combo)
hbox2.addWidget(self.connect_button)
hbox2.addWidget(self.new_window_button)
vbox.addLayout(hbox1)
vbox.addLayout(hbox2)
# 设置窗口布局
self.setLayout(vbox)
```
接下来,我们需要实现获取串口列表的函数get_serial_list()。
```python
def get_serial_list(self):
# 获取所有可用的串口列表
ports = serial.tools.list_ports.comports()
port_list = []
# 遍历所有串口,将串口号添加到列表中
for port, desc, hwid in sorted(ports):
port_list.append(port)
return port_list
```
现在,我们需要实现连接串口的功能。当用户点击连接按钮时,程序会尝试连接串口,如果连接成功,按钮会变成“断开串口”,如果连接失败,会弹出一个错误提示框。
```python
def connect_serial(self):
if self.connect_button.text() == "连接串口":
# 获取当前选择的串口号和波特率
port = self.serial_port_combo.currentText()
baud_rate = int(self.baud_rate_combo.currentText())
try:
# 连接串口
self.serial = serial.Serial(port, baud_rate)
self.connect_button.setText("断开串口")
except serial.serialutil.SerialException:
# 弹出错误提示框
QMessageBox.warning(self, "错误", "无法连接串口!")
else:
# 断开串口
self.serial.close()
self.connect_button.setText("连接串口")
```
最后,我们需要实现打开新窗口的功能。当用户点击打开新窗口按钮时,程序会打开一个新的窗口,里面只包含一个关闭按钮。当用户点击关闭按钮时,窗口会关闭。
```python
def open_new_window(self):
# 创建新窗口
new_window = QWidget()
close_button = QPushButton("关闭")
# 创建布局
vbox = QVBoxLayout()
# 将控件添加到布局中
vbox.addWidget(close_button)
# 设置窗口布局
new_window.setLayout(vbox)
# 显示新窗口
new_window.show()
# 连接关闭按钮的信号和槽
close_button.clicked.connect(new_window.close)
```
现在,我们将所有代码放在一起,就可以实现完整的功能了。
```python
import sys
import serial
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QComboBox, QVBoxLayout, QHBoxLayout, QLabel, QMessageBox
class MainWindow(QWidget):
def __init__(self):
super().__init__()
# 创建串口列表
self.serial_list = self.get_serial_list()
# 创建控件
self.serial_port_combo = QComboBox()
self.baud_rate_combo = QComboBox()
self.connect_button = QPushButton("连接串口")
self.new_window_button = QPushButton("打开新窗口")
# 将串口列表添加到串口选择框中
self.serial_port_combo.addItems(self.serial_list)
# 将波特率添加到波特率选择框中
self.baud_rate_combo.addItems(["9600", "115200"])
# 创建布局
vbox = QVBoxLayout()
hbox1 = QHBoxLayout()
hbox2 = QHBoxLayout()
# 将控件添加到布局中
hbox1.addWidget(QLabel("串口号:"))
hbox1.addWidget(self.serial_port_combo)
hbox1.addWidget(QLabel("波特率:"))
hbox1.addWidget(self.baud_rate_combo)
hbox2.addWidget(self.connect_button)
hbox2.addWidget(self.new_window_button)
vbox.addLayout(hbox1)
vbox.addLayout(hbox2)
# 设置窗口布局
self.setLayout(vbox)
# 连接信号和槽
self.connect_button.clicked.connect(self.connect_serial)
self.new_window_button.clicked.connect(self.open_new_window)
def get_serial_list(self):
# 获取所有可用的串口列表
ports = serial.tools.list_ports.comports()
port_list = []
# 遍历所有串口,将串口号添加到列表中
for port, desc, hwid in sorted(ports):
port_list.append(port)
return port_list
def connect_serial(self):
if self.connect_button.text() == "连接串口":
# 获取当前选择的串口号和波特率
port = self.serial_port_combo.currentText()
baud_rate = int(self.baud_rate_combo.currentText())
try:
# 连接串口
self.serial = serial.Serial(port, baud_rate)
self.connect_button.setText("断开串口")
except serial.serialutil.SerialException:
# 弹出错误提示框
QMessageBox.warning(self, "错误", "无法连接串口!")
else:
# 断开串口
self.serial.close()
self.connect_button.setText("连接串口")
def open_new_window(self):
# 创建新窗口
new_window = QWidget()
close_button = QPushButton("关闭")
# 创建布局
vbox = QVBoxLayout()
# 将控件添加到布局中
vbox.addWidget(close_button)
# 设置窗口布局
new_window.setLayout(vbox)
# 显示新窗口
new_window.show()
# 连接关闭按钮的信号和槽
close_button.clicked.connect(new_window.close)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
希望这个例子可以帮助你了解如何在PyQt中创建两个窗口,以及如何连接串口和打开新窗口。
阅读全文