本文展示了一个由AI生成的前端股票监控界面,采用PyQt5框架实现。界面包含顶部状态栏、中央数据表格、左侧导航标签、右侧信息面板和底部状态栏,支持窗口置顶和透明度调节。中央表格展示20支股票的15项关键数据,包括代码、名称、涨幅等,并配有自动刷新功能。界面设计美观专业,包含可移动的内部窗口,代码结构清晰易扩展,演示了AI在UI开发中的强大能力。
这是我写的前端UI


这是AI写的前端界面,确实很漂亮。并且内部窗口可以移动。看了之后,直呼牛气


AI写的前端界面代码详见下
import sys
import random
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
QLabel, QPushButton, QTableWidget, QTableWidgetItem, QSplitter,
QTabWidget, QStatusBar, QGroupBox, QDockWidget, QHeaderView)
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QColor, QFont, QIcon
class StockMonitor(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("股票盯盘小助手")
self.setGeometry(100, 50, 1600, 900)
self.initUI()
def initUI(self):
# 1. 创建顶部状态栏
self.createTopBar()
# 2. 创建中央表格
self.createCentralTable()
# 3. 创建左侧标签导航
self.createLeftTabs()
# 4. 创建右侧信息面板
self.createRightDock()
# 5. 创建底部状态栏
self.createBottomBar()
# 6. 设置窗口置顶和透明度
self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)
self.setWindowOpacity(1) # 95%透明度
# 7. 定时刷新数据
self.refresh_timer = QTimer(self)
self.refresh_timer.timeout.connect(self.refresh_data)
self.refresh_timer.start(5000) # 5秒刷新一次
def createTopBar(self):
"""创建顶部状态栏"""
top_widget = QWidget()
layout = QHBoxLayout()
# 市场数据
market_data = QLabel("上涨: 2055 下跌: 2920 涨停: 81 跌停: 1 炸板: 9")
market_data.setStyleSheet("font-weight: bold; color: #333;")
# 功能按钮
btn_st = QPushButton("不看ST股")
btn_refresh = QPushButton("刷新设置")
btn_settings = QPushButton("关于/设置")
btn_exit = QPushButton("退出")
btn_exit.clicked.connect(self.close)
# 日期显示
date_label = QLabel("2025/7/27")
layout.addWidget(market_data)
layout.addWidget(btn_st)
layout.addStretch()
layout.addWidget(date_label)
layout.addWidget(btn_refresh)
layout.addWidget(btn_settings)
layout.addWidget(btn_exit)
top_widget.setLayout(layout)
self.setMenuWidget(top_widget)
def createCentralTable(self):
"""创建中央数据表格"""
self.table = QTableWidget()
self.table.setRowCount(20)
self.table.setColumnCount(15)
# 表头设置
headers = ["代码", "名称", "连板", "涨停原因", "涨停价", "涨幅%",
"封单", "换手%", "流通", "总值", "首封", "封住", "开板", "几天", "涨"]
self.table.setHorizontalHeaderLabels(headers)
# 表格样式
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Interactive)
self.table.setAlternatingRowColors(True)
self.table.setStyleSheet("""
QTableWidget {
font-size: 11px;
gridline-color: #e0e0e0;
}
QHeaderView::section {
background-color: #f5f5f5;
padding: 4px;
}
""")
# 填充示例数据
self.populate_table_data()
self.setCentralWidget(self.table)
def populate_table_data(self):
"""填充表格数据"""
# 示例股票数据
stock_data = [
["600519", "贵州茅台", "1", "白酒龙头", "1850.00", "+2.38",
"1.2万手", "0.45", "1.2万亿", "2.3万亿", "09:30", "09:30", "0", "1", "↑"],
["000858", "五粮液", "1", "白酒", "175.50", "+1.85",
"8500手", "0.78", "6800亿", "6800亿", "09:31", "09:31", "0", "1", "↑"],
["601318", "中国平安", "0", "保险", "48.25", "-0.62",
"3200手", "0.32", "8800亿", "8800亿", "", "", "0", "0", "↓"],
["600036", "招商银行", "0", "银行", "35.80", "+0.28",
"4500手", "0.25", "9000亿", "9000亿", "", "", "0", "0", "↑"],
["000001", "平安银行", "0", "银行", "12.35", "+0.41",
"2800手", "0.45", "2400亿", "2400亿", "", "", "0", "0", "↑"],
["600900", "长江电力", "0", "电力", "24.80", "+1.02",
"3800手", "0.18", "5400亿", "5400亿", "", "", "0", "0", "↑"],
["601888", "中国中免", "0", "免税", "98.60", "-1.25",
"4200手", "0.85", "2000亿", "2000亿", "", "", "0", "0", "↓"],
["300750", "宁德时代", "0", "新能源", "210.50", "+3.15",
"2.5万手", "1.25", "9200亿", "9200亿", "", "", "0", "0", "↑"],
["600276", "恒瑞医药", "0", "医药", "42.30", "+0.95",
"3600手", "0.65", "2700亿", "2700亿", "", "", "0", "0", "↑"],
["000333", "美的集团", "0", "家电", "58.90", "+0.86",
"2800手", "0.42", "4100亿", "4100亿", "", "", "0", "0", "↑"]
]
# 填充数据
for row, data in enumerate(stock_data):
for col, value in enumerate(data):
item = QTableWidgetItem(value)
# 特殊样式
if col == 5: # 涨幅列
if "+" in value:
item.setForeground(QColor(255, 0, 0)) # 红色
elif "-" in value:
item.setForeground(QColor(0, 255, 0)) # 绿色
self.table.setItem(row, col, item)
def createLeftTabs(self):
"""创建左侧标签导航"""
tab_widget = QTabWidget()
tab_widget.setTabPosition(QTabWidget.West)
tab_widget.setStyleSheet("QTabBar::tab { height: 50px; width: 80px; }")
# 添加标签页
tabs = ["涨停板", "炸板", "同花顺人气", "昨日涨停表现", "跌停板",
"热点风", "同花情绪", "封板进阶统计", "盘前新闻",
"TIX板块周期表", "游资龙虎榜", "游资动向", "核心龙虎榜"]
for tab in tabs:
tab_content = QWidget()
layout = QVBoxLayout()
layout.addWidget(QLabel(f"{tab}内容区域"))
tab_content.setLayout(layout)
tab_widget.addTab(tab_content, tab)
# 停靠在左侧
left_dock = QDockWidget("功能导航", self)
left_dock.setWidget(tab_widget)
left_dock.setFeatures(QDockWidget.DockWidgetMovable)
self.addDockWidget(Qt.LeftDockWidgetArea, left_dock)
def createRightDock(self):
"""创建右侧信息面板"""
right_widget = QWidget()
layout = QVBoxLayout()
# 涨停原因分析
reason_group = QGroupBox("涨停原因")
reason_layout = QVBoxLayout()
reasons = [("白酒", 2), ("新能源", 3), ("医药", 1), ("其他", 4)]
for name, count in reasons:
item = QLabel(f"{name}: {count}只")
reason_layout.addWidget(item)
# 热点分析
hot_group = QGroupBox("热点分析")
hot_layout = QVBoxLayout()
hots = [("锂电池", 3), ("光伏", 2), ("人工智能", 4)]
for name, count in hots:
item = QLabel(f"{name}: {count}只")
hot_layout.addWidget(item)
# 持仓信息
position_group = QGroupBox("持仓信息")
position_layout = QVBoxLayout()
positions = [
("总市值", "¥ 245,600.00"),
("今日盈亏", "+¥ 3,560.00"),
("持仓盈亏", "+¥ 12,450.00"),
("可用资金", "¥ 56,780.00")
]
for name, value in positions:
item = QLabel(f"{name}: {value}")
position_layout.addWidget(item)
reason_group.setLayout(reason_layout)
hot_group.setLayout(hot_layout)
position_group.setLayout(position_layout)
layout.addWidget(reason_group)
layout.addWidget(hot_group)
layout.addWidget(position_group)
layout.addStretch()
right_widget.setLayout(layout)
# 停靠在右侧
right_dock = QDockWidget("分析面板", self)
right_dock.setWidget(right_widget)
self.addDockWidget(Qt.RightDockWidgetArea, right_dock)
def createBottomBar(self):
"""创建底部状态栏"""
status_bar = QStatusBar()
# 提示信息
tips = QLabel("提示: 按F12隐藏/显示窗口 | 右键菜单可设置提醒")
tips.setStyleSheet("color: #888;")
# 版权信息
copyright = QLabel("股票盯盘小助手 v1.0 | By: 程序爱好者")
warning = QLabel("股票有风险,投资需谨慎")
status_bar.addWidget(tips, 1)
status_bar.addPermanentWidget(copyright)
status_bar.addPermanentWidget(warning)
self.setStatusBar(status_bar)
def refresh_data(self):
"""刷新数据 - 模拟实时更新"""
# 随机更新几个股票的涨幅
for i in range(5):
row = random.randint(0, self.table.rowCount() - 1)
col = 5 # 涨幅列
if self.table.item(row, col):
current_value = self.table.item(row, col).text()
if current_value:
try:
# 解析当前涨幅值
change = float(current_value.strip('+').strip('%'))
# 随机生成新的涨幅 (-2% 到 +5%)
new_change = change + random.uniform(-0.5, 1.0)
new_change = round(new_change, 2)
# 设置新值并更新颜色
new_value = f"{'+' if new_change >= 0 else ''}{new_change}%"
self.table.item(row, col).setText(new_value)
if new_change > 0:
self.table.item(row, col).setForeground(QColor(255, 0, 0))
else:
self.table.item(row, col).setForeground(QColor(0, 255, 0))
# 检查是否达到提醒条件
self.check_price_alert(row, new_change)
except ValueError:
pass
def check_price_alert(self, row, change):
"""检查是否达到价格提醒条件"""
# 这里可以添加自定义的提醒逻辑
# 例如:当涨幅超过5%时进行提醒
if change > 5:
stock_code = self.table.item(row, 0).text()
stock_name = self.table.item(row, 1).text()
print(f"提醒: {stock_name}({stock_code}) 涨幅超过5%!")
# 实际应用中这里可以添加弹窗、声音提醒等
def keyPressEvent(self, event):
"""快捷键处理"""
if event.key() == Qt.Key_F12:
# F12切换显示/隐藏
if self.isVisible():
self.hide()
else:
self.show()
elif event.key() == Qt.Key_Escape:
self.close()
else:
super().keyPressEvent(event)
if __name__ == "__main__":
app = QApplication(sys.argv)
# 设置全局样式
app.setStyleSheet("""
QMainWindow {
background-color: #f8f9fa;
font-family: "Microsoft YaHei";
}
QTableWidget {
alternate-background-color: #f8f9fa;
}
QDockWidget {
titlebar-close-icon: none;
font-size: 12px;
}
QGroupBox {
border: 1px solid #ddd;
border-radius: 4px;
margin-top: 1ex;
font-weight: bold;
}
QPushButton {
padding: 5px 10px;
background-color: #f0f0f0;
border: 1px solid #ccc;
border-radius: 3px;
}
QPushButton:hover {
background-color: #e0e0e0;
}
""")
window = StockMonitor()
window.show()
sys.exit(app.exec_())
但是也仅仅只是停留在前端表面,后端逻辑都得自己写。
860

被折叠的 条评论
为什么被折叠?



