猜数字小游戏
本次涉及的知识点,主要是以下几点:
1.按钮小提示
2.QLineEdit小部件使用
3.QMessageBox的使用
4.关闭窗口事件触发
同以往一样,我们还是根据代码来逐一讲解。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QLineEdit
from PyQt5.QtGui import QIcon
from random import randint
class Example(QWidget):
def __init__(self):
super().__init__()
self.num = randint(1, 100)
self.init_ui()
def init_ui(self):
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('猜数字')
self.setWindowIcon(QIcon('草莓.png'))
self.bt1 = QPushButton('我猜', self)
self.bt1.setGeometry(115, 150, 70, 30)
self.bt1.setToolTip('<b>点击这里猜数字</b>')
self.bt1.clicked.connect(self.show_message)
self.text = QLineEdit('在这里输入数字', self)
self.text.selectAll()
self.text.setFocus()
self.text.setGeometry(80, 50, 150, 30)
self.show()
def show_message(self):
guess_number = int(self.text.text())
print(self.num)
if guess_number > self.num:
QMessageBox.about(self, '看结果','猜大了!')
self.text.setFocus()
elif guess_number < self.num:
QMessageBox.about(self, '看结果','猜小了!')
self.text.setFocus()
else:
QMessageBox.about(self, '看结果', '答对了!进入下一轮!')
self.num = randint(1, 100)
self.text.clear()
self.text.setFocus()
def closeEvent(self, QCloseEvent):
reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
QCloseEvent.accpet()
else:
QCloseEvent.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
上面这个程序实现的主要功能是,系统随机产生一个1-100之间的整数,我们去猜,看看能否猜中这个数字。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QLineEdit
from PyQt5.QtGui import QIcon
from random import randint
本次程序中我们使用到的模块,较上次教程多了QMessageBox, QLineEdit类和random模块。
def __init__(self):
super().__init__()
self.initUI()
self.num = randint(1,100)
类在进行初始化的时候,自动产生一个1-100的随机整数。
self.bt1.setToolTip('<b>点击这里猜数字</b>')
要创建一个工具提示,我们调用setTooltip()方法。 我们可以使用富文本格式。鼠标停留在按钮上就会出现,如下图:
self.bt1.clicked.connect(self.showMessage)
当按钮被单击时我们调用showMessage())方法去响应执行。
self.text = QLineEdit('在这里输入数字', self)
self.text.selectAll()
self.text.setFocus()
self.text.setGeometry(80, 50, 150 ,30)
这里建立一个QLineEdit对象,用于让玩家输入数字。“在这里输入数字”是当窗口出现时出现的默认字符;selectAll()方法则是可以理解为将“在这里输入数字”进行全选,方便输入数字,否则你还得手动全选删除默认字符,如下图:
setFocus()就是让焦点置于文本栏中,方便用户输入,不然还得手动在文本栏中单击一下,很是麻烦。没有焦点的效果如下:
setGeometry()就是设置小部件的摆放坐标以及大小。
def showMessage(self):
guessnumber = int(self.text.text())
if guessnumber > self.num:
QMessageBox.about(self, '看结果','猜大了!')
self.text.setFocus()
elif guessnumber < self.num:
QMessageBox.about(self, '看结果','猜小了!')
self.text.setFocus()
else:
QMessageBox.about(self, '看结果','答对了!进入下一轮!')
self.num = randint(1,100)
self.text.clear()
self.text.setFocus()
这里就是对猜测的数字和系统随机生成的数字就行判断了。因为QLineEdit输入的内容是str类型的,所有我们要进行类型转换。
QMessageBox.about就是弹出一个对话框,告诉你结果是什么样的。如下图:
事实上QMessageBox除了有about外,还有我们程序中用到的QMessageBox.question。
QMessageBox.critical
QMessageBox.warning
QMessageBox.information
QMessageBox对话框包含类型只是图标不同其他无太大差别。
这里在说明一下,当我们回答正确的时候,调用clear()方法,将文本栏里面的内容清除,同时重新生成一个随机数,并将焦点置于文本栏中。
def closeEvent(self, QCloseEvent):
reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
QCloseEvent.accpet()
else:
QCloseEvent.ignore()
如果关闭QWidget,则生成QCloseEvent。 要修改widget的行为,我们需要重新实现closeEvent()事件处理程序。
我们显示一个带有两个按钮的消息框:Yes和No。第一个字符串出现在标题栏上。 第二个字符串是对话框显示的消息文本。 第三个参数指定出现在对话框中的按钮的组合。 最后一个参数是默认按钮。 它是初始键盘焦点的按钮。 返回值存储在答复变量中。
这里我们根据返回值进行判断。 如果我们单击Yes按钮,我们接受导致关闭窗口小部件并终止应用程序的事件。 否则我们忽略关闭事件。