python GUI

from PyQt5.sip import isdeleted
from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeWidget, QTreeWidgetItem, QCheckBox, QHBoxLayout, \
QVBoxLayout, QWidget, QPushButton, QMessageBox, QLabel, QLineEdit, QComboBox, QSpacerItem, QSizePolicy, \
QGridLayout, QProgressBar, QStyle, QStyledItemDelegate, QAction, QMenuBar, QFileDialog, QTextEdit
from PyQt5.QtCore import Qt, QTimer, QObject, pyqtSignal, QObject, QThread,QUrl
from PyQt5.QtGui import QColor
from pyecharts.charts import (Bar, Line, Pie, Scatter, Map, Page, Grid,
Bar3D, WordCloud)
from pyecharts import options as opts
from pyecharts.globals import ThemeType, ChartType
from pyecharts.faker import Faker
from pyecharts.commons.utils import JsCode
from PyQt5.QtWebEngineWidgets import QWebEngineView
import random
import sys
from pyecharts.charts import Bar
from pyecharts import options as opts

BUTTON_STYLESHEET = """
QPushButton {
background-color: deepskyblue; /* 背景颜色 */
color: white; /* 文字颜色 */
border-radius: 15px; /* 圆角半径 */
padding: 10px; /* 内边距 */
}
QPushButton:hover {
background-color: dodgerblue; /* 鼠标悬停时的背景颜色 */
}
QPushButton:pressed {
background-color: deepskyblue; /* 按钮按下时的背景颜色 */
}
"""

class CustomTitleBar(QWidget):
def __init__(self, parent):
super().__init__(parent)
self.parent = parent

# 标题栏布局
layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)

# 标题标签
self.title = QLabel("抽奖界面")
self.title.setStyleSheet("""
QLabel {
color: white;
font: 13px;
padding-left: 10px;
}
""")

# 最小化/最大化/关闭按钮
self.min_btn = QPushButton("-")
self.max_btn = QPushButton("□")
self.close_btn = QPushButton("×")

# 设置按钮样式
btn_style = """
QPushButton {
background: transparent;
color: white;
border: none;
font: bold 15px;
padding: 0 8px;
}
QPushButton:hover {
background: #555;
}
QPushButton:pressed {
background: #777;
}
"""
for btn in [self.min_btn, self.max_btn, self.close_btn]:
btn.setStyleSheet(btn_style)
btn.setFixedSize(30, 30)

# 特殊样式关闭按钮
self.close_btn.setStyleSheet(btn_style + """
QPushButton:hover {
background: #e81123;
}
""")

# 添加控件
layout.addWidget(self.title)
layout.addStretch()
layout.addWidget(self.min_btn)
layout.addWidget(self.max_btn)
layout.addWidget(self.close_btn)

self.setLayout(layout)

# 连接信号
self.min_btn.clicked.connect(parent.showMinimized)
self.max_btn.clicked.connect(self.toggle_maximize)
self.close_btn.clicked.connect(parent.close)

def toggle_maximize(self):
if self.parent.isMaximized():
self.parent.showNormal()
self.max_btn.setText("□")
else:
self.parent.showMaximized()
self.max_btn.setText("❐")

class Example(QMainWindow):
def __init__(self):
super().__init__()

self.initUI()

def initUI(self):
# 创建一个按钮
self.load_case_Button = QPushButton('运行', self)
# 设置按钮的位置和大小
self.load_case_Button.move(95, 80)
# 设置按钮的大小
self.load_case_Button.resize(60,40)
self.setWindowFlags(Qt.FramelessWindowHint)
main_layout = QVBoxLayout()
main_layout.setSpacing(10)
load_case_layout = QVBoxLayout()
load_case_layout.addWidget(self.load_case_Button)
# 创建自定义标题栏
self.title_bar = CustomTitleBar(self)
self.setMenuWidget(self.title_bar)
# 设置窗口样式
self.setStyleSheet("""
QMainWindow {
background: #2c3e50;
}
""")
self.load_case_Button.setStyleSheet(BUTTON_STYLESHEET)
load_case_layout.addWidget(self.load_case_Button)
# 创建垂直布局
load_case_layout = QVBoxLayout()
load_case_layout.addWidget(self.load_case_Button)

# 创建结果文本框
self.result_label = QLineEdit(self)
self.result_label.setReadOnly(True)
self.result_label.setFixedSize(60, 30)
self.result_label.move(95, 130)
load_case_layout.addWidget(self.result_label) # 将文本框加入布局
self.load_case_Button.clicked.connect(self.load_case_control)

# 创建一个按钮
self.load_case_Button1 = QPushButton('数据', self)
# 设置按钮的位置和大小
self.load_case_Button1.move(95, 180)
# 设置按钮的大小
self.load_case_Button1.resize(60,40)
self.setWindowFlags(Qt.

FramelessWindowHint)
self.load_case_Button1.setStyleSheet(BUTTON_STYLESHEET)
load_case_layout.addWidget(self.load_case_Button1)
main_layout = QVBoxLayout()
main_layout.setSpacing(10)
load_case_layout = QVBoxLayout()
load_case_layout.addWidget(self.load_case_Button1)
self.load_case_Button1.clicked.connect(self.open_new_window)

# 显示窗口
self.setGeometry(600, 600, 250, 250)
self.show()
sys.exit(app.exec_())

def open_new_window(self):
self.new_window = NewWindow() # 创建新窗口实例
self.new_window.show() # 显示新窗口

def load_case(self):
a = ['好吃', '抽象']
b = random.choice(a)
QMessageBox.information(self, '随机抽奖结果', b)
return b

def load_case_control(self):
self.disable_button()
res = self.load_case()
self.result_label.setText(res)

def enable_button(self):
"""
启用加载用例按钮
"""
self.load_case_Button.setEnabled(True)
self.load_case_Button.setStyleSheet(BUTTON_STYLESHEET)

def disable_button(self):
self.load_case_Button.setEnabled(False)
self.load_case_Button.setStyleSheet("""
QPushButton {
background-color: gray; /* 按钮置灰 */
color: white; /* 文字颜色 */
border-radius: 15px; /* 圆角半径 */
padding: 10px; /* 内边距 */
}
""")
QTimer.singleShot(2000, self.enable_button)


def create_chart():
bar = Bar()
bar.add_xaxis(["A", "B", "C", "D", "E"])

bar.add_yaxis("Series1", [10, 20, 30, 40, 50])
bar.set_global_opts(title_opts=opts.TitleOpts(title="Simple Bar Chart"))
return bar.render_embed() # 使用render_embed()生成HTML代码而不是保存到文件

class NewWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("新窗口")
self.setGeometry(150, 150, 300, 200)

self.setWindowTitle('PyQt5 with Pyecharts Example')
self.setGeometry(100, 100, 800, 600)

layout = QVBoxLayout()
self.webview = QWebEngineView()
layout.addWidget(self.webview)

container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)

# 设置HTML内容
html_content = create_chart()
self.webview.setHtml(html_content)

from pyecharts.charts import (Bar, Line, Pie, Scatter, Map, Page, Grid,
Bar3D, WordCloud)
from pyecharts import options as opts
from pyecharts.globals import ThemeType, ChartType
from pyecharts.faker import Faker
from pyecharts.commons.utils import JsCode


class Dashboard(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("综合数据看板")
# 尺寸、全屏设置
self.resize(1600, 1200)
# 数据加载、界面搭建
self.load_data()
central_widget = QWidget()
self.setCentralWidget(central_widget)
main_layout = QVBoxLayout(central_widget)
# 指标卡片、图表区域添加
metrics_widget = self.create_metrics_section()
main_layout.addWidget(metrics_widget)
# 分割器实现区域大小可调
splitter = QSplitter(Qt.Vertical)
upper_charts = self.create_upper_charts()
lower_charts = self.create_lower_charts()
splitter.addWidget(upper_charts)
splitter.addWidget(lower_charts)
main_layout.addWidget(splitter)

def create_upper_charts(self):
"""创建上半部分图表区域"""
widget = QWidget()
layout = QGridLayout(widget)

# 柱状图
bar_chart = self.create_bar_chart()
layout.addWidget(bar_chart, 0, 0)

# 折线图
line_chart = self.create_line_chart()
layout.addWidget(line_chart, 0, 1)

# 散点图
scatter_chart = self.scatter_visual_map()
layout.addWidget(scatter_chart, 1, 0)

# 环形图
barh_chart = self.create_barh_chart()
layout.addWidget(barh_chart, 1, 1)

# 根据图表特点设置网格布局的行列比例,让图表更适配自身比例
layout.setColumnStretch(0, 1)
layout.setColumnStretch(1, 1)
layout.setRowStretch(0, 1)
layout.setRowStretch(1, 1)

return widget

def create_lower_charts(self):
"""创建下半部分图表区域"""
widget = QWidget()
layout = QHBoxLayout(widget)

# 中国地图
map_chart = self.create_map_chart()
layout.addWidget(map_chart)

# 条形图
pie_chart = self.create_pie_chart()
layout.addWidget(pie_chart)

# 根据地图和条形图特点调整布局比例
layout.setStretch(0, 1) # 地图部分更宽一些
layout.setStretch(1, 1)

return widget

if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

posted @ 2025-10-24 19:28  先定一个小目标  阅读(20)  评论(0)    收藏  举报