事件与页面切换
控件事件绑定
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWidgets import QPushButton, QLineEdit, QSpinBox
事件绑定三要素: xxx发生xx就做xx
事件源 发生 事件 就 执行某个操作(事件驱动程序)
绑定程序:事件源.事件.connect(操作对应的函数)
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.create_ui()
self.setGeometry(200, 100, 800, 600)
self.setWindowTitle('图书管理系统首页')
self.show()
def create_ui(self):
btn1 = QPushButton('确定', self)
btn1.move(50, 10)
# 按钮点击事件
btn1.clicked.connect(self.btn_action)
self.input1 = QLineEdit(self)
self.input1.setPlaceholderText('请输入手机号')
self.input1.move(50, 60)
# 输入框内容改变事件
self.input1.textChanged.connect(self.input_text_action)
num_input = QSpinBox(self)
num_input.move(100, 100)
num_input.valueChanged.connect(self.num_action)
def num_action(self, value):
print('数值改变', value)
def btn_action(self, value):
print('按钮被点击', value, self.input1.text())
def input_text_action(self, value):
print('输入框内容改变', value)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
图片的使用
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton
from PyQt5.QtGui import QImage, QIcon, QPixmap, QPalette
from PyQt5.QtCore import QSize
from PyQt5.QtCore import Qt
import requests
def download_image():
response = requests.get('https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=158268377,3003399912&fm=26&gp=0.jpg')
if response.status_code == 200:
return response.content
print('请求失败!', response)
return None
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.create_ui()
self.setGeometry(200, 100, 800, 450)
self.setWindowTitle('图书管理系统首页')
self.show()
def create_ui(self):
# 1. 设置窗口图标
icon = QIcon('files/logo.png')
self.setWindowIcon(icon)
# 2. 显示图片
self.bg_label = QLabel(self)
self.bg_label.setGeometry(0, 0, 800, 450)
self.bgpix = QPixmap('files/bg.jpg')
self.bg_label.setPixmap(self.bgpix)
username = QLabel('用户名:', self)
username.move(100, 100)
username.setStyleSheet('QLabel{color: rgb(255, 255, 255); font-size:30px;}')
# 3.显示网络图片
# 下载图片
image_data = download_image()
# 使用网络图片数据创建图片对象
image = QImage.fromData(image_data)
# 对图片进行缩放
image = image.scaled(200, 200)
pix = QPixmap.fromImage(image)
# 显示图片
btn = QLabel(self)
btn.setGeometry(200, 100, 200, 200)
btn.setPixmap(pix)
# 思考:怎么将图片放在按钮上?
# 在窗口的大小发送改变的时候会被自动调用
def resizeEvent(self, a0) -> None:
# 获取到最新的窗口大小
w_size = self.size()
# 对原图进行缩放
image = QImage('files/bg.jpg')
new_image = image.scaled(w_size.width(), w_size.height())
pix = QPixmap.fromImage(new_image)
# 将显示图片的label进行缩放
self.bg_label.setGeometry(0, 0, w_size.width(), w_size.height())
self.bg_label.setPixmap(pix)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
菜单
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QAction, QMenu
from PyQt5.QtGui import QIcon
如果想要在窗口上添加菜单,那么窗口的类型必须是QMainWindow或QMainWindow的子类
# 第一步,让窗口类继承QMainWindow
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.create_ui()
self.setGeometry(200, 100, 800, 600)
self.setWindowTitle('图书管理系统首页')
self.show()
def create_ui(self):
# 第二步:添加各种菜单
# 1. 获取当前窗口上菜单栏
menu_bar = self.menuBar()
menu_bar.setNativeMenuBar(False) # mac需要添加,否则菜单栏不显示
# 2.在菜单栏上添加菜单
file_menu = menu_bar.addMenu('File')
edit_menu = menu_bar.addMenu('&Edit')
# 3.在菜单上添加选项
fa1 = QAction('New Project', self) # 创建选项
fa1.triggered.connect(self.new_project) # 给选项绑定事件
fa2 = QAction(QIcon('files/naozhong.png'), 'Open', self)
fa2.triggered.connect(self.open_action)
fa2.setShortcut('ctrl+o') # 添加快捷键
# 将选项添加到菜单上
file_menu.addActions([fa1, fa2])
# 4. 添加子菜单
file_p_menu = QMenu('File Projecties', self)
file_menu.addMenu(file_p_menu)
fpa1 = QAction('File Encoding', self)
fpa2 = QAction('Remove BOM', self)
fpa3 = QAction('Make File Read-Only', self)
file_p_menu.addActions([fpa1, fpa2, fpa3])
# 在窗口上点鼠标右键的时候会被自动调用
def contextMenuEvent(self, event) -> None:
# 创建菜单对象
right_menu = QMenu(self)
# 在右键菜单上添加选项或者子菜单
a1 = QAction('copy', self)
a2 = QAction('Paste', self)
a3 = QAction('Cut', self)
right_menu.addActions([a1, a2, a3])
# 让菜单显示在当前窗口鼠标所在的位置
right_menu.exec_(self.mapToGlobal(event.pos()))
对话框
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel,QPushButton, QMessageBox, QInputDialog, QColorDialog, QFontDialog, QFileDialog
from PyQt5.QtGui import QPalette, QColor
class Value:
Yes = 16384
No = 65536
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.create_ui()
self.setGeometry(200, 100, 800, 600)
self.setWindowTitle('图书管理系统首页')
self.show()
def create_ui(self):
message_btn = QPushButton('确定', self)
message_btn.move(100, 20)
message_btn.clicked.connect(self.show_message_box)
self.color_label = QLabel('你好', self)
pa = QPalette()
pa.setColor(self.backgroundRole(), QColor(255, 0, 0))
self.setPalette(pa)
self.autoFillBackground()
def show_message_box(self):
print('显示消息框!')
# 1. QMessageBox
# 消息类型:information、question、warning、critical、about
# QMessageBox.消息类型()
# QMessageBox.information(self, '对话框', '中午好!', QMessageBox.Ok)
# result = QMessageBox.question(self, '问题', '是否删除改数据?', QMessageBox.Yes|QMessageBox.No)
# if result == Value.Yes:
# print('YES')
# else:
# print('NO')
# 2. QInputDialog
# result = QInputDialog.getText(self, '', '请输入名字:')
# print(result)
result = QColorDialog.getColor()
print(result.rgb())
pa = QPalette()
pa.setColor(self.backgroundRole(), result)
self.setPalette(pa)
self.autoFillBackground()
# QFontDialog.getFont()
# QFileDialog.getOpenFileUrl()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
作业
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QGridLayout,QMessageBox
from PyQt5.QtWidgets import QLabel, QLineEdit, QPushButton
from PyQt5.QtGui import QPalette, QColor
import pymysql
def operating_database(acount,ps):
conn = pymysql.Connect(
host='localhost',
port =3306,
user = 'root',
password='ly19950926.',
database='library',
autocommit=True
)
try:
with conn.cursor() as cursor:
cursor.execute(f"select * from tb_user where user_acount='{acount}' and user_ps='{ps}';")
return cursor.fetchall()
except IndexError:
pass
finally:
conn.close()
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.acount = None
self.ps = None
self.style_sheet()
self.create_ui()
self.setGeometry(200, 100, 800, 600)
self.setWindowTitle('图书管理系统首页')
self.show()
def style_sheet(self):
self.setStyleSheet(
'''
QLabel{color:rgb(95,60,55); font-size:15px;}
QLineEdit{height: 35px; width:250px; border: 1px solid rgb(95,60,55); border-radius: 8px;}
QPushButton{height: 35px; width:100px; border: 1px solid rgb(95,60,55); background-color: rgb(119,78,45); color: rgb(255, 245, 235); border-radius: 8px;}
''')
# self.setStyleSheet('QLineEdit{width: 200px;}')
def check(self):
# print(self.acount,self.ps,type(self.acount),type(self.ps))
result = operating_database(self.acount,self.ps)
print(result)
if not result:
print('账号或密码错误!')
QMessageBox.information(self,'提示','账号或密码错误!',QMessageBox.Ok)
else:
print('登录成功!')
QMessageBox.information(self, '提示', '登录成功!', QMessageBox.Ok)
def acount_text(self,value):
print(value)
self.acount = value
def ps_text(self,value):
print(value)
self.ps = value
def create_ui(self):
# 设置窗口背景颜色
# self.setStyleSheet('QWidget{background-color: rgb(205,193,168);}')
pa = QPalette()
pa.setColor(self.backgroundRole(), QColor(205, 193, 168))
self.setPalette(pa)
self.autoFillBackground()
# 大盒子
box = QHBoxLayout(self)
# 中间内容盒子
box1 = QVBoxLayout()
box.addStretch(1)
box.addLayout(box1)
box.addStretch(1)
# 标题
box4 = QHBoxLayout()
title_label = QLabel('千锋图书管理系统', self)
title_label.setStyleSheet('QLabel{color: rgb(91, 64, 37); font-size: 30px; font-weight:900;}')
box4.addStretch(1)
box4.addWidget(title_label)
box4.addStretch(1)
# 输入账号密码
box2 = QGridLayout()
username = QLabel('用户名:', self)
username_input = QLineEdit(self)
username_input.textChanged.connect(self.acount_text)
pw = QLabel('密 码:', self)
pw_input = QLineEdit(self)
pw_input.textChanged.connect(self.ps_text)
box2.addWidget(username, 1, 1)
box2.addWidget(username_input, 1, 2)
box2.addWidget(pw, 2, 1)
box2.addWidget(pw_input, 2, 2)
# 登录和退出按钮
box3 = QHBoxLayout()
btn1 = QPushButton('登录', self)
btn1.clicked.connect(self.check)
btn2 = QPushButton('退出', self)
box3.addWidget(btn1)
box3.addStretch(1)
box3.addWidget(btn2)
box1.addStretch(1)
box1.addLayout(box4)
box1.addStretch(2)
box1.addLayout(box2)
box1.addStretch(2)
box1.addLayout(box3)
box1.addStretch(20)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())