ミッション要件
- ユーザーは、船舶のチャーターを開始する場合は S を入力し、船舶のチャーターを停止する場合は E を入力します。
- 一日が終わったら、各ボートのレンタル状況を集計し、最短レンタル時間、最長レンタル時間などを出力します。
- 管理者は定期的に船舶に信号を送信しており、船舶が信号を受信できない場合は船舶が失われたと判断します。
外部サポートライブラリの説明
- PyQt5 を使用して GUI を設計します。インストール方法は前の記事を参照してください: PyQt5 インストール チュートリアル
- UML クラス図を生成するには、 graphvizとpyreverse を使用します。graphviz のインストールについては、前の記事を参照してください: pythongraphviz の描画pyreverse インストール: pip install pylint、クラス図生成コマンド: pyreverse -ASmy -o png a/注: a は、コードは保存されており、使用する前にインストールする必要があります。コード名を __init__.py に変更しないと、次のエラーが報告されます。
クラスデザイン
カテゴリ全体の設計は比較的シンプルで、回答は GUI 部分と GUI のロジック実装部分の 2 つのカテゴリに分かれており、そのうち、rent_1 クラスの関数を使用して憲章を実現しています。詳細については、showtime_1 クラス関数を使用して時間を計算し、transform 関数を使用して船が失われたかどうかを処理します。
結果分析
実行結果の一部を図に示します。
統計結果:
著者に関する情報:
エラー解決
- Python は関数を実行し、エラー「TypeError:rent_1() は 1 つの位置引数を受け取りますが、2 つが与えられました」を報告します。
このエラーは、この関数が変数を 1 つだけ受け取りますが、実際の使用では 2 つの変数が渡されることを意味します。これは、最初に Python クラス関数を作成したときに、クラス関数のパラメーター リストに self を記述せず、self を追加するだけだったためです。
したがって、Python がクラス オブジェクトを呼び出すときは、関数自体を表すためにクラス関数のパラメーター リストに self を記述する必要があります。 QMessageBox.about()
関数について
QMessageBox は QT の非常にシンプルな小さなウィンドウです. about 関数はコンテンツを埋めるために使用されます. 関数のプロトタイプは次のとおりです:
(method) about: (parent: QWidget, caption: str, text: str) -> None
したがって、ウィンドウ自体に加えて、この関数は 2 つの文字列型パラメータのみを渡すことができます。
3.QTime
授業の申込みについて
self.timer.start(1000)
self.rent_time.stop()
開始タイミング。括弧内の単位はミリ秒で、更新の頻度を示します。
self.sum1 = temp.secsTo(rtime)
secsTo()
2 つの QTime クラス間で、関数を使用して時間差を秒単位で計算できます。
システム分析の概要
- 実際的な考慮事項に基づくと、データベースを呼び出してリース情報を追加、削除、確認、変更する方が合理的かつ効果的です。
- 信号の送受信には、ネットワーク通信やマルチスレッドが考えられます。
完全なソースコード
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'rboat.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
# 作者:L-M-Y
import numbers
import threading
from tokenize import String
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit
from matplotlib import widgets
from PyQt5.QtCore import QDate, QTime, QDateTime, Qt
import time
# GUI模块
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(928, 826)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(280, 20, 341, 81))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.label.setFont(font)
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(70, 230, 71, 31))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(70, 360, 71, 21))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(70, 490, 71, 21))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(70, 610, 71, 21))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.label_5.setFont(font)
self.label_5.setObjectName("label_5")
self.label_6 = QtWidgets.QLabel(self.centralwidget)
self.label_6.setGeometry(QtCore.QRect(71, 135, 71, 31))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.label_6.setFont(font)
self.label_6.setObjectName("label_6")
self.label_7 = QtWidgets.QLabel(self.centralwidget)
self.label_7.setGeometry(QtCore.QRect(200, 130, 151, 41))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.label_7.setFont(font)
self.label_7.setObjectName("label_7")
self.label_8 = QtWidgets.QLabel(self.centralwidget)
self.label_8.setGeometry(QtCore.QRect(480, 130, 101, 41))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.label_8.setFont(font)
self.label_8.setObjectName("label_8")
self.label_9 = QtWidgets.QLabel(self.centralwidget)
self.label_9.setGeometry(QtCore.QRect(700, 140, 81, 21))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.label_9.setFont(font)
self.label_9.setObjectName("label_9")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(620, 720, 121, 51))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(13)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.line = QtWidgets.QFrame(self.centralwidget)
self.line.setGeometry(QtCore.QRect(0, 170, 881, 16))
self.line.setFrameShape(QtWidgets.QFrame.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line.setObjectName("line")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(230, 720, 121, 51))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(13)
self.pushButton_2.setFont(font)
self.pushButton_2.setObjectName("pushButton_2")
self.textBrowser_9 = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser_9.setGeometry(QtCore.QRect(640, 80, 251, 31))
self.textBrowser_9.setObjectName("textBrowser_9")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(480, 210, 91, 51))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.pushButton_3.setFont(font)
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(690, 210, 91, 51))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)
self.pushButton_4.setFont(font)
self.pushButton_4.setObjectName("pushButton_4")
self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_5.setGeometry(QtCore.QRect(480, 340, 91, 51))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.pushButton_5.setFont(font)
self.pushButton_5.setObjectName("pushButton_5")
self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_6.setGeometry(QtCore.QRect(690, 340, 91, 51))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.pushButton_6.setFont(font)
self.pushButton_6.setObjectName("pushButton_6")
self.pushButton_7 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_7.setGeometry(QtCore.QRect(480, 610, 91, 51))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.pushButton_7.setFont(font)
self.pushButton_7.setObjectName("pushButton_7")
self.pushButton_8 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_8.setGeometry(QtCore.QRect(480, 470, 91, 51))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.pushButton_8.setFont(font)
self.pushButton_8.setObjectName("pushButton_8")
self.pushButton_9 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_9.setGeometry(QtCore.QRect(690, 470, 91, 51))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.pushButton_9.setFont(font)
self.pushButton_9.setObjectName("pushButton_9")
self.pushButton_10 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_10.setGeometry(QtCore.QRect(690, 610, 91, 51))
font = QtGui.QFont()
font.setFamily("Arial Black")
font.setPointSize(12)
self.pushButton_10.setFont(font)
self.pushButton_10.setObjectName("pushButton_10")
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(210, 200, 171, 31))
self.textBrowser.setObjectName("textBrowser")
self.textBrowser_2 = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser_2.setGeometry(QtCore.QRect(210, 260, 171, 31))
self.textBrowser_2.setObjectName("textBrowser_2")
self.textBrowser_3 = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser_3.setGeometry(QtCore.QRect(210, 330, 171, 31))
self.textBrowser_3.setObjectName("textBrowser_3")
self.textBrowser_5 = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser_5.setGeometry(QtCore.QRect(210, 390, 171, 31))
self.textBrowser_5.setObjectName("textBrowser_5")
self.textBrowser_6 = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser_6.setGeometry(QtCore.QRect(210, 460, 171, 31))
self.textBrowser_6.setObjectName("textBrowser_6")
self.textBrowser_7 = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser_7.setGeometry(QtCore.QRect(210, 520, 171, 31))
self.textBrowser_7.setObjectName("textBrowser_7")
self.textBrowser_8 = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser_8.setGeometry(QtCore.QRect(210, 590, 171, 31))
self.textBrowser_8.setObjectName("textBrowser_8")
self.textBrowser_10 = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser_10.setGeometry(QtCore.QRect(210, 650, 171, 31))
self.textBrowser_10.setObjectName("textBrowser_10")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 928, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate(
"MainWindow", "LMY\'S Boat Renting System"))
self.label_2.setText(_translate("MainWindow", "boat 1"))
self.label_3.setText(_translate("MainWindow", "boat 2"))
self.label_4.setText(_translate("MainWindow", "boat 3"))
self.label_5.setText(_translate("MainWindow", "boat 4"))
self.label_6.setText(_translate("MainWindow", "ID"))
self.label_7.setText(_translate("MainWindow", "Renting Time"))
self.label_8.setText(_translate("MainWindow", "Renting"))
self.label_9.setText(_translate("MainWindow", "Status"))
self.pushButton.setText(_translate("MainWindow", "Sum"))
self.pushButton_2.setText(_translate("MainWindow", "Author"))
self.pushButton_3.setText(_translate("MainWindow", "S"))
self.pushButton_4.setText(_translate("MainWindow", "Safe"))
self.pushButton_5.setText(_translate("MainWindow", "S"))
self.pushButton_6.setText(_translate("MainWindow", "Safe"))
self.pushButton_7.setText(_translate("MainWindow", "S"))
self.pushButton_8.setText(_translate("MainWindow", "S"))
self.pushButton_9.setText(_translate("MainWindow", "Safe"))
self.pushButton_10.setText(_translate("MainWindow", "Safe"))
# GUI逻辑功能部分
class NameController(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
global cnt
i = 0
self.flag_1 = "0"
self.sum1 = 0
self.sum2 = "0"
self.sum3 = "0"
self.sum4 = "0"
self.rent = []
self.overall_string = "Date : "
for i in range(4):
self.rent.append(0)
cnt = 1
push = 0
super().__init__()
self.setupUi(self)
time = QDateTime.currentDateTime() # 获取当前时间
timedisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd") # 格式化时间
rtime = QDateTime.currentDateTime() # 获取当前时间
rtimedisplay = rtime.toString("yyyy-MM-dd hh:mm:ss dddd") # 格式化时间
self.textBrowser_9.setText(timedisplay)
self.timer = QTimer()
self.timer.start(1000) # 时间类开始运转,每秒更新一次
self.rent_time = QTimer()
self.rent_time_2 = QTimer()
self.rent_time_3 = QTimer()
self.rent_time_4 = QTimer()
self.timer.timeout.connect(self.showtime)
self.pushButton_3.clicked.connect(self.rent_1)
self.pushButton_5.clicked.connect(self.rent_2)
self.pushButton_8.clicked.connect(self.rent_3)
self.pushButton_7.clicked.connect(self.rent_4)
self.pushButton_2.clicked.connect(lambda: QMessageBox.about(
self, "About the author", "Name: Liu MiYi\n Class: Computer Science\nDate: 2022.9.23"))
''' self.pushButton.clicked.connect(lambda: QMessageBox.about(
self, "About the renting of boats", self.overall_string)) '''
self.push_1 = 0
self.push_2 = 0
self.push_3 = 0
self.push_4 = 0
# self.end_time1 = "0"
self.pushButton_4.clicked.connect(self.transform_1)
self.pushButton_6.clicked.connect(self.transform_2)
self.pushButton_9.clicked.connect(self.transform_3)
self.pushButton_10.clicked.connect(self.transform_4)
def transform_1(self):
self.pushButton_4.setText("Safe")
def transform_2(self):
self.pushButton_6.setText("Safe")
def transform_3(self):
self.pushButton_9.setText("Safe")
def transform_4(self):
self.pushButton_10.setText("Safe")
def rent_1(self):
self.push_1 = self.push_1+1
# print(self.push_1)
self.rent_time.start(1000)
self.rent_time.timeout.connect(self.showtime_1)
self.pushButton_3.setText("E")
if(self.push_1 == 1):
rttime = QDateTime.currentDateTime() # 获取当前时间
global temp
temp = rttime
rttimedisplay = rttime.toString("yyyy-MM-dd hh:mm:ss dddd")
rt = rttimedisplay[0:19]
okl = int(rttimedisplay[11:13])
# print(okl)
if(okl < 13):
self.overall_string = self.overall_string + \
rttimedisplay[5:10]+" Morning\nBoat1 Renting Time : "
else:
self.overall_string = self.overall_string + \
rttimedisplay[5:10]+" Afternoon\nBoat1 Renting Time : "
self.textBrowser.setText(rt)
if(self.push_1 == 2):
self.pushButton_3.setText("S")
self.rent_time.stop()
self.overall_string = self.overall_string + \
str(self.rent[0])+"seconds\nBoat1 Renting Time: "
def showtime_1(self):
rtime = QDateTime.currentDateTime() # 获取当前时间
rtimedisplay = rtime.toString("yyyy-MM-dd hh:mm:ss dddd") # 格式化时间
r = rtimedisplay[0:19]
self.flag_1 = rtimedisplay[18]
if(self.flag_1 == "5"):
self.pushButton_4.setText("Lost")
self.textBrowser_2.setText(r)
self.sum1 = temp.secsTo(rtime)
self.rent[0] = self.sum1
def rent_2(self):
self.push_2 = self.push_2+1
self.rent_time_2.start(1000)
self.rent_time_2.timeout.connect(self.showtime_2)
self.pushButton_5.setText("E")
if(self.push_2 == 1):
rttime_2 = QDateTime.currentDateTime() # 获取当前时间
rttimedisplay_2 = rttime_2.toString("yyyy-MM-dd hh:mm:ss dddd")
rt_2 = rttimedisplay_2[0:19]
global temp2
temp2 = rttime_2
self.textBrowser_3.setText(rt_2)
if(self.push_2 == 2):
# self.textBrowser_2.setText(self.end_time1)
self.pushButton_5.setText("S")
self.rent_time_2.stop()
self.overall_string = self.overall_string + \
str(self.rent[1])+" seconds\n"+"Boat3 Renting Time : "
# print(self.push_1)
def showtime_2(self):
rtime = QDateTime.currentDateTime() # 获取当前时间
rtimedisplay = rtime.toString("yyyy-MM-dd hh:mm:ss dddd") # 格式化时间
r = rtimedisplay[0:19]
self.flag_2 = rtimedisplay[18]
if(self.flag_2 == "5"):
self.pushButton_6.setText("Lost")
self.textBrowser_5.setText(r)
self.sum2 = temp2.secsTo(rtime)
self.rent[1] = self.sum2
# print(self.rent[1])
def rent_3(self):
self.push_3 = self.push_3+1
self.rent_time_3.start(1000)
self.rent_time_3.timeout.connect(self.showtime_3)
self.pushButton_8.setText("E")
if(self.push_3 == 1):
rttime_3 = QDateTime.currentDateTime() # 获取当前时间
rttimedisplay_3 = rttime_3.toString("yyyy-MM-dd hh:mm:ss dddd")
global temp3
temp3 = rttime_3
rt_3 = rttimedisplay_3[0:19]
self.textBrowser_6.setText(rt_3)
if(self.push_3 == 2):
self.pushButton_8.setText("S")
self.rent_time_3.stop()
self.overall_string = self.overall_string + \
str(self.rent[2])+" seconds\n"+"Boat4 Renting Time : "
def showtime_3(self):
rtime = QDateTime.currentDateTime() # 获取当前时间
rtimedisplay = rtime.toString("yyyy-MM-dd hh:mm:ss dddd") # 格式化时间
r = rtimedisplay[0:19]
self.flag_3 = rtimedisplay[18]
self.sum3 = temp3.secsTo(rtime)
self.rent[2] = self.sum3
if(self.flag_3 == "5"):
self.pushButton_9.setText("Lost")
self.textBrowser_7.setText(r)
def rent_4(self):
self.push_4 = self.push_4+1
self.rent_time_4.start(1000)
self.rent_time_4.timeout.connect(self.showtime_4)
self.pushButton_7.setText("E")
if(self.push_4 == 1):
rttime_4 = QDateTime.currentDateTime() # 获取当前时间
rttimedisplay_4 = rttime_4.toString("yyyy-MM-dd hh:mm:ss dddd")
global temp4
temp4 = rttime_4
rt_4 = rttimedisplay_4[0:19]
self.textBrowser_8.setText(rt_4)
if(self.push_4 == 2):
self.pushButton_7.setText("S")
self.rent_time_4.stop()
num_boats = 0
if(self.pushButton_4.text() == "Safe"):
num_boats = num_boats+1
if(self.pushButton_6.text() == "Safe"):
num_boats = num_boats+1
if(self.pushButton_9.text() == "Safe"):
num_boats = num_boats+1
if(self.pushButton_10.text() == "Safe"):
num_boats = num_boats+1
self.overall_string = self.overall_string + \
str(self.rent[3])+" seconds\nMax Renting Time : " + \
str(max(self.rent))+" seconds\nMin Renting Time : " + \
str(min(self.rent)) + \
" seconds\n"+"The Number of Boats :" + str(num_boats)
self.pushButton.clicked.connect(lambda: QMessageBox.about(
self, "About the renting of boats", self.overall_string))
# print(self.push_1)
def showtime_4(self):
rtime = QDateTime.currentDateTime() # 获取当前时间
rtimedisplay = rtime.toString("yyyy-MM-dd hh:mm:ss dddd") # 格式化时间
r = rtimedisplay[0:19]
self.flag_4 = rtimedisplay[18]
self.sum4 = temp4.secsTo(rtime)
self.rent[3] = self.sum4
if(self.flag_4 == "5"):
self.pushButton_10.setText("Lost")
self.textBrowser_10.setText(r)
def showtime(self):
if(cnt):
time = QDateTime.currentDateTime() # 获取当前时间
timedisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd") # 格式化时间
self.textBrowser_9.setText(timedisplay)
else:
self.timer.stop()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv) # Instantiate an app
window = NameController() # Instantiate a window
window.show() # Show window at default size
# Run the app and do some cleanup when the app exits
sys.exit(app.exec_())