Устранения дублирования клика PyQt5
Я пишу программу и столкнулся с такой проблемой: После угадывания числа пользователь, например, захотел сыграть ещё раз. В это и проблема.
После повторного генерирования числа (не выходя из приложения), пользователь пытается угадать число и после нажатия кнопки Enter запрос дублируется и кроме этого дублируется количество попыток. Как это устранить?
import sys
import random
from time import sleep
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, \
QLabel, QAction, QMainWindow, QStatusBar, QMenu, QMessageBox, qApp
# from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QIcon, QFont, QWindow, QKeySequence
class Game(QMainWindow):
def __init__(self):
super().__init__()
self._createActions() # +++
self._createMenuBar() # +++
self.initUI()
self._createStatusBar() # +++
def _createActions(self):
self.exitAction = QAction(QIcon("img/exit.png"), "&Quit", self)
self.exitAction.triggered.connect(self.close)
self.helpContentAction = QAction(QIcon("img/readMe.png"), "&Help Content", self)
self.helpContentAction.setStatusTip("Show the application's About box")
self.helpContentAction.triggered.connect(self.about)
self.aboutAction = QAction("&About Qt", self)
self.aboutAction.setStatusTip("Show the Qt library's About box")
self.aboutAction.triggered.connect(qApp.aboutQt)
def _createMenuBar(self):
menuBar = self.menuBar()
fileMenu = QMenu("&File", self)
fileMenu.addAction(self.exitAction)
menuBar.addMenu(fileMenu)
# Используя icon and a title
helpMenu = menuBar.addMenu(QIcon("img/qtlogo.png"), "&Help")
helpMenu.addAction(self.helpContentAction)
helpMenu.addAction(self.aboutAction)
def _createStatusBar(self):
self.statusbar = self.statusBar()
# Adding a temporary message
self.statusbar.showMessage("Hello StatusBar", 3000)
# Добавление постоянного сообщения
self.text_1 = "<h3 style='color: red;'>Hello World</h3>"
self.wcLabel = QLabel(f"{self.text_1}")
self.statusbar.addPermanentWidget(self.wcLabel)
def about(self):
QMessageBox.about(self, "How this work?",
"First for all you must enter minimum and maximum of numbers."
"Next step this Guessing the generated number."
"For a new game, you need to restart the application")
def initUI(self):
# Window
self.setWindowTitle('Game')
# ? self.setFixedSize(460, 210)
# Buttons
self.enter = QPushButton('Enter', self)
self.enter.setFixedSize(70, 30)
self.enter.move(100, 25)
self.enter.setEnabled(False)
self.enter_range = QPushButton('Enter range', self)
self.enter_range.setFixedSize(80, 35)
self.enter_range.move(150, 77)
# LineEdit
self.number = QLineEdit(self)
self.number.setPlaceholderText('Num')
self.number.setFixedSize(50, 25)
self.number.move(20, 28)
self.number.setFont(QFont('Times New Roman', 12))
self.num_int = self.number.text()
self.froms = QLineEdit(self)
self.froms.setPlaceholderText('From')
self.froms.setFixedSize(45, 30)
self.froms.move(10, 80)
self.froms.setFont(QFont('Times New Roman', 12))
self.tos = QLineEdit(self)
self.tos.setPlaceholderText('To')
self.tos.setFixedSize(45, 30)
self.tos.move(80, 80)
self.tos.setFont(QFont('Times New Roman', 12))
# Label answer
self.answer = QLabel('', self)
self.answer.setStyleSheet('border: 2px solid black')
self.answer.setFixedSize(270, 60)
self.answer.move(10, 140)
# count
self.sum_text = QLabel('Количество попыток:', self)
self.sum = QLabel('', self)
self.sum_text.setFixedSize(140, 20)
self.sum_text.setStyleSheet('border: 2px solid black')
self.sum.setFont(QFont('Times New Roman', 15))
self.sum_text.setFont(QFont('Times New Roman', 11))
self.sum_text.move(300, 140)
self.sum.setFixedSize(50, 30)
self.sum.setStyleSheet('border: 2px solid black')
self.sum.move(340, 170)
self.total = 0
self.enter_range.clicked.connect(self.enter_ranges)
# ? total = 0
def enter_ranges(self):
Froms = int(self.froms.text())
To = int(self.tos.text())
self.rand_num = random.randrange(Froms, To)
self.answer.setText('Ok! Number is ready!')
self.answer.setFont(QFont('Times New Roman', 15))
self.enter.clicked.connect(self.trying)
self.sum.setText(str(self.total))
self.enter.setEnabled(True)
self.enter_range.setEnabled(False)
def trying(self):
self.total += 1
self.sum.setText(str(self.total))
Enter_num = int(self.number.text())
Rand_num = self.rand_num
print("Total {0}".format(self.total))
print(Rand_num)
if Enter_num == Rand_num:
self.answer.setText("Right! You're using {0} try".format(self.total))
self.enter_range.setEnabled(True)
elif Enter_num > Rand_num:
self.answer.setText('Lower!')
elif Enter_num < Rand_num:
self.answer.setText('Bigger!')
if __name__ == '__main__':
app = QApplication(sys.argv)
gm = Game()
gm.resize(500, 400)
gm.show()
app.exec_()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Основная ошибка в том, что вы не в том месте подключаете сигнал!
self.enter.clicked.connect(self.trying)
его надо вынести в метод initUI, иначе вы его подключаете многократно.
И некоторые другие погрешности отметил по тексту:
import sys
import random
from time import sleep
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, \
QLabel, QAction, QMainWindow, QStatusBar, QMenu, QMessageBox, qApp
# from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QIcon, QFont, QWindow, QKeySequence
class Game(QMainWindow):
def __init__(self):
super().__init__()
self._createActions() # +++
self._createMenuBar() # +++
self.initUI()
self._createStatusBar() # +++
def _createActions(self):
self.exitAction = QAction(QIcon("img/exit.png"), "&Quit", self)
self.exitAction.triggered.connect(self.close)
self.helpContentAction = QAction(QIcon("img/readMe.png"), "&Help Content", self)
self.helpContentAction.setStatusTip("Show the application's About box")
self.helpContentAction.triggered.connect(self.about)
self.aboutAction = QAction("&About Qt", self)
self.aboutAction.setStatusTip("Show the Qt library's About box")
self.aboutAction.triggered.connect(qApp.aboutQt)
def _createMenuBar(self):
menuBar = self.menuBar()
fileMenu = QMenu("&File", self)
fileMenu.addAction(self.exitAction)
menuBar.addMenu(fileMenu)
# Используя icon and a title
helpMenu = menuBar.addMenu(QIcon("img/qtlogo.png"), "&Help")
helpMenu.addAction(self.helpContentAction)
helpMenu.addAction(self.aboutAction)
def _createStatusBar(self):
self.statusbar = self.statusBar()
# Adding a temporary message
self.statusbar.showMessage("Hello StatusBar", 3000)
# Добавление постоянного сообщения
self.text_1 = "<h3 style='color: red;'>Hello World</h3>"
self.wcLabel = QLabel(f"{self.text_1}")
self.statusbar.addPermanentWidget(self.wcLabel)
def about(self):
QMessageBox.about(self, "How this work?",
"First for all you must enter minimum and maximum of numbers."
"Next step this Guessing the generated number."
"For a new game, you need to restart the application")
def initUI(self):
# Window
self.setWindowTitle('Game')
# ? self.setFixedSize(460, 210)
# Buttons
self.enter = QPushButton('Enter', self)
self.enter.setFixedSize(70, 30)
self.enter.move(100, 25)
self.enter.setEnabled(False)
self.enter.clicked.connect(self.trying) # +++
self.enter_range = QPushButton('Enter range', self)
self.enter_range.setFixedSize(80, 35)
self.enter_range.move(150, 77)
# LineEdit
self.number = QLineEdit(self)
self.number.setPlaceholderText('Num')
self.number.setFixedSize(50, 25)
self.number.move(20, 28)
self.number.setFont(QFont('Times New Roman', 12))
self.num_int = self.number.text()
self.froms = QLineEdit(self)
self.froms.setPlaceholderText('From')
self.froms.setFixedSize(45, 30)
self.froms.move(10, 80)
self.froms.setFont(QFont('Times New Roman', 12))
self.tos = QLineEdit(self)
self.tos.setPlaceholderText('To')
self.tos.setFixedSize(45, 30)
self.tos.move(80, 80)
self.tos.setFont(QFont('Times New Roman', 12))
# Label answer
self.answer = QLabel('answer', self)
self.answer.setStyleSheet('border: 2px solid black')
self.answer.setFixedSize(270, 60)
self.answer.move(10, 140)
# count
self.sum_text = QLabel('Количество попыток:', self)
self.sum = QLabel('', self)
self.sum_text.setFixedSize(140, 20)
self.sum_text.setStyleSheet('border: 2px solid black')
self.sum.setFont(QFont('Times New Roman', 15))
self.sum_text.setFont(QFont('Times New Roman', 11))
self.sum_text.move(300, 140)
self.sum.setFixedSize(50, 30)
self.sum.setStyleSheet('border: 2px solid black')
self.sum.move(340, 170)
self.total = 0
self.enter_range.clicked.connect(self.enter_ranges)
# ? total = 0
def enter_ranges(self):
_froms = int(self.froms.text())
_to = int(self.tos.text())
if _froms < _to: # +++
self.rand_num = random.randrange(_froms, _to)
self.answer.setText('Ok! Number is ready!')
self.answer.setFont(QFont('Times New Roman', 15))
#- self.enter.clicked.connect(self.trying)
self.sum.setText(str(self.total))
self.enter.setEnabled(True)
self.enter_range.setEnabled(False)
else:
msg = QMessageBox.information(self, "Внимание!", "Вы неправильно задали интервал.")
def trying(self):
self.total += 1
self.sum.setText(str(self.total))
Enter_num = int(self.number.text())
Rand_num = self.rand_num
print("Total {0}".format(self.total))
print(Rand_num)
if Enter_num == Rand_num:
self.answer.setText("Правильно! \nВы использовали {0} попытки.".format(self.total))
self.enter_range.setEnabled(True)
self.enter.setEnabled(False) # +++
self.total = 0 # +++
self.froms.clear() # +++
self.tos.clear() # +++
self.number.clear() # +++
elif Enter_num > Rand_num:
self.answer.setText('Lower!')
elif Enter_num < Rand_num:
self.answer.setText('Bigger!')
if __name__ == '__main__':
app = QApplication(sys.argv)
gm = Game()
gm.resize(500, 400)
gm.show()
app.exec_()
