视频链接:
PyQt实现-答案之书
源码如下:
import random
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QTextEdit
from PyQt5.QtCore import QSize
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt, QPoint, QRect
from PyQt5.QtGui import QMouseEvent
from PyQt5.QtGui import QFont
from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QPalette
import json
g_alpha = 0
g_color = None
g_old_style_sheet = None
class XWidget(QWidget):
def __init__(self):
super().__init__()
self.loadconfig()
self.load_answer()
self.dragging = False
# 设置窗口的标题和大小
self.setWindowTitle('答案之书')
self.setAttribute(Qt.WA_TranslucentBackground)
self.setWindowFlags(Qt.FramelessWindowHint) # 去掉窗口边框
self.resize(self.config_data['window_width'], self.config_data['window_height'])
self.background_pixmap = QPixmap('./docs/background.png')
if self.background_pixmap is None:
print('pixmap is None')
self.input_edit = QLineEdit(self)
# self.input_edit.setFixedSize(200, 30) # 设置输入框的尺寸
template = """
QLineEdit {{
border: none;
padding: 0;
background: transparent;
color: {color};
font-size: {font_size}px;
font-family:{font_family};
padding: 5px;
}}
QLineEdit:focus {{
border: none;
outline: none;
}}
"""
formatted = template.format(color=self.config_data['input_font_color'],
font_size=self.config_data['input_font_size'],
font_family=self.config_data['input_font_family'])
self.input_edit.setStyleSheet(formatted)
self.input_edit.returnPressed.connect(self.handle_return_pressed)
self.input_edit.setAlignment(Qt.AlignCenter)
input_font = QFont()
# input_font.setPointSize(self.config_data["input_font_size"]) # 设置字体大小为 16
input_font.setFamily(self.config_data["input_font_family"])
self.answer_edit = QTextEdit(self)
self.answer_template = """
QTextEdit QScrollBar:vertical {{
subcontrol-position: top;
subcontrol-origin: margin;
height: 10px;
}}
QTextEdit {{
border: none;
padding: 0;
background: transparent;
color: rgb({color});
font-family: '{font_family}';
font-size: {font_size}px;
text-align: center;
}}
QTextEdit QScrollBar:horizontal {{
border: 1px solid black;
background: lightgray;
height: 10px;
subcontrol-position: left;
subcontrol-origin: margin;
width: 0px;
}}
QTextEdit:focus {{
border: none;
outline: none;
}}
"""
formatted = self.answer_template.format(color=self.config_data['answer_font_rgb'],
font_size=self.config_data['answer_font_size'],
font_family=self.config_data['answer_font_family'])
# print(formatted)
self.answer_edit.setStyleSheet(formatted)
self.answer_edit.setAlignment(Qt.AlignCenter)
self.input_edit.setFont(input_font)
self.position_input_box()
def loadconfig(self):
try:
with open('docs/config.json', 'r', encoding='utf-8') as file:
self.config_data = json.load(file)
print(self.config_data)
except FileNotFoundError:
print("文件未找到,请检查文件路径。")
except json.JSONDecodeError:
print("文件内容不是有效的 JSON 格式。")
except Exception as e:
print(f"发生错误: {e}")
def load_answer(self):
lines = []
# 打开文件并读取每一行
with open('docs/answers.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
# 去掉每行的换行符
self.answers = [line.strip() for line in lines]
def resizeEvent(self, event):
super().resizeEvent(event)
# 每次窗口大小变化时重新设置输入框的位置
super().resizeEvent(event)
# 保持长宽比例为 1:1
size = min(self.width(), self.height())
self.resize(size, size)
self.position_input_box()
def position_input_box(self):
# 计算输入框的位置和大小
width = self.width()
height = self.height()
input_width = 300
input_height = 200
x = width // 2 - input_width // 2
y = height * 3 // 5 - input_height // 2
self.input_edit.setGeometry(QRect(QPoint(x, y), QSize(input_width, input_height)))
output_width = 400
output_height = 200
ox = width // 2 - output_width // 2
oy = height * 2 // 5 - output_height // 2
self.answer_edit.setGeometry(QRect(QPoint(ox, oy), QSize(output_width, output_height)))
self.answer_edit.setAlignment(Qt.AlignRight)
def paintEvent(self, event):
painter = QPainter(self)
# 绘制背景图片,保持图片与窗口大小一致
painter.drawPixmap(self.rect(), self.background_pixmap)
def mousePressEvent(self, event: QMouseEvent):
print('mouse press')
if event.button() == Qt.LeftButton:
print("is left")
# 计算中心点
center = self.rect().center()
print(self.rect().center())
# 检查点击位置是否在中心区域
if (self.rect().center() - event.pos()).manhattanLength() < 111150:
print("chengli ")
self.dragging = True
self.drag_start_position = event.globalPos() # 保存点击位置
def mouseMoveEvent(self, event: QMouseEvent):
if self.dragging:
# 计算拖动距离
delta = event.globalPos() - self.drag_start_position
self.move(self.pos() + delta)
self.drag_start_position = event.globalPos() # 更新起始位置
def mouseReleaseEvent(self, event: QMouseEvent):
if event.button() == Qt.LeftButton:
self.dragging = False
if __name__ == '__main__':
app = QApplication(sys.argv)
window = XWidget()
window.show()
sys.exit(app.exec_())
本小程序已被多个主播使用
长期接各种编码需求