feat(每日一言): 增加古诗词选项并优化显示布局

- 添加类型选择下拉框,支持普通箴言和古诗词句切换
- 增大每日一言显示区域尺寸,提升阅读体验
- 使用不同API获取古诗词内容
- 优化天气数据显示,增加生活提示信息
马子昂 4 months ago
parent 81dacb769b
commit 1dea565fe0

@ -228,22 +228,39 @@ class WordRibbon(QFrame):
quote_group = self.create_ribbon_group("每日一言")
quote_layout = QVBoxLayout()
# 每日一言显示标签
self.quote_label = QLabel("暂无")
self.quote_label.setStyleSheet("QLabel { color: #666666; font-style: italic; font-size: 10px; }")
self.quote_label.setWordWrap(True)
self.quote_label.setFixedWidth(150)
# 创建第一行:类型选择下拉框和刷新按钮
top_row_layout = QHBoxLayout()
# 类型选择下拉框
self.quote_type_combo = QComboBox()
self.quote_type_combo.addItems(["普通箴言", "古诗词句"])
self.quote_type_combo.setFixedSize(120, 25)
self.quote_type_combo.currentTextChanged.connect(self.on_quote_type_changed)
# 刷新按钮
self.refresh_quote_btn = QPushButton("刷新箴言")
self.refresh_quote_btn.clicked.connect(self.on_refresh_quote)
self.refresh_quote_btn.setFixedSize(80, 25)
# 添加到第一行布局
top_row_layout.addWidget(self.quote_type_combo)
top_row_layout.addWidget(self.refresh_quote_btn)
top_row_layout.addStretch() # 添加弹性空间,使控件靠左对齐
# 每日一言显示标签 - 增大尺寸
self.quote_label = QLabel("暂无")
self.quote_label.setStyleSheet("QLabel { color: #666666; font-style: italic; font-size: 10px; }")
self.quote_label.setWordWrap(True)
self.quote_label.setFixedWidth(250) # 增加到250像素宽度
self.quote_label.setMinimumHeight(40) # 设置最小高度,增加显示空间
# 添加到主布局
quote_layout.addLayout(top_row_layout)
quote_layout.addWidget(self.quote_label)
quote_layout.addWidget(self.refresh_quote_btn)
quote_group.setLayout(quote_layout)
self.quote_group = quote_group
self.current_quote_type = "普通箴言" # 默认类型
# 组件创建完成后自动获取每日一言
self.load_daily_quote()
@ -303,44 +320,63 @@ class WordRibbon(QFrame):
def load_daily_quote(self):
"""加载每日一言"""
try:
# 创建每日一言API实例
quote_api = daily_sentence_API("https://api.nxvav.cn/api/yiyan")
# 获取每日一言数据
quote_data = quote_api.get_sentence('json')
if quote_data and isinstance(quote_data, dict):
# 从返回的数据中提取每日一言文本
quote_text = quote_data.get('yiyan', '暂无每日一言')
self.update_quote_display(quote_text)
# 根据当前选择的类型获取不同的内容
if self.current_quote_type == "古诗词句":
# 获取古诗词
quote_text = self.get_chinese_poetry()
else:
# 如果API返回空或格式不正确显示默认文本
self.update_quote_display("暂无每日一言")
# 获取普通箴言
quote_api = daily_sentence_API("https://api.nxvav.cn/api/yiyan")
quote_data = quote_api.get_sentence('json')
if quote_data and isinstance(quote_data, dict):
quote_text = quote_data.get('yiyan', '暂无每日一言')
else:
quote_text = "暂无每日一言"
self.update_quote_display(quote_text)
except Exception as e:
print(f"加载每日一言失败: {e}")
self.update_quote_display("暂无每日一言")
self.update_quote_display("获取失败")
def on_refresh_quote(self):
"""刷新每日一言按钮点击处理"""
self.load_daily_quote()
def on_quote_type_changed(self, quote_type):
"""每日一言类型切换处理"""
self.current_quote_type = quote_type
# 类型切换时自动刷新内容
self.load_daily_quote()
def get_chinese_poetry(self):
"""获取古诗词 - 使用古诗词·一言API随机返回不同诗词"""
try:
# 创建每日一言API实例
quote_api = daily_sentence_API("https://api.nxvav.cn/api/yiyan")
# 获取每日一言数据
quote_data = quote_api.get_sentence('json')
# 使用古诗词·一言API - 每次返回随机不同的诗词
response = requests.get("https://v1.jinrishici.com/all.json", timeout=5)
if quote_data and isinstance(quote_data, dict):
# 从返回的数据中提取每日一言文本
quote_text = quote_data.get('yiyan', '暂无每日一言')
self.update_quote_display(quote_text)
if response.status_code == 200:
data = response.json()
content = data.get('content', '')
author = data.get('author', '')
title = data.get('origin', '')
# 格式化显示文本
if content and author and title:
return f"{content}{author}{title}"
elif content and author:
return f"{content}{author}"
elif content:
return content
else:
return "暂无古诗词"
else:
# 如果API返回空或格式不正确显示默认文本
self.update_quote_display("获取每日一言失败")
return "获取古诗词失败"
except Exception as e:
print(f"获取每日一言失败: {e}")
self.update_quote_display("获取每日一言失败")
print(f"获取古诗词失败: {e}")
return "获取古诗词失败"
def update_quote_display(self, quote_text):
"""更新每日一言显示"""
@ -643,6 +679,28 @@ class WeatherAPI:
city_info = data['cityInfo']
current_data = data['data']
# 获取生活提示信息
life_tips = []
forecast = current_data.get('forecast', [])
if forecast:
# 从预报中提取提示信息
for day in forecast[:3]: # 取前3天的提示
notice = day.get('notice', '')
if notice:
life_tips.append(notice)
# 如果没有获取到足够的提示,添加一些默认的
default_tips = [
"愿你拥有比阳光明媚的心情",
"雾霾来袭,戴好口罩再出门",
"今天天气不错,适合出去走走",
"记得多喝水,保持身体健康"
]
# 补充到至少3个提示
while len(life_tips) < 3 and default_tips:
life_tips.append(default_tips.pop(0))
weather_info = {
'temp': current_data['wendu'],
'feels_like': current_data['wendu'], # 没有体感温度,用实际温度代替
@ -651,7 +709,8 @@ class WeatherAPI:
'wind_dir': current_data['forecast'][0]['fx'],
'wind_scale': '1', # 没有风力等级,用默认值
'vis': current_data['forecast'][0]['high'], # 用最高温作为可见度
'pressure': '1013' # 没有气压,用默认值
'pressure': '1013', # 没有气压,用默认值
'life_tips': life_tips # 添加生活提示信息
}
print(f"解析后的天气信息: {weather_info}")
return weather_info
@ -699,7 +758,8 @@ class WeatherAPI:
weather_data = {
'city': city_name,
'current': current,
'forecast': forecast
'forecast': forecast,
'life_tips': current.get('life_tips', []) # 添加生活提示信息
}
return weather_data
else:
@ -1153,7 +1213,8 @@ class WeatherAPI:
'humidity': weather_info['humidity'],
'wind_scale': weather_info['wind_scale']
},
'forecast': forecast
'forecast': forecast,
'life_tips': weather_info.get('life_tips', []) # 添加生活提示信息
}
print(f"无法获取城市ID: {original_city_name}")

@ -158,16 +158,8 @@ class WordStyleMainWindow(QMainWindow):
weather_data = self.weather_api.get_weather_data(city)
if weather_data:
print(f"获取到天气数据: {weather_data}")
# 格式化数据以匹配状态栏期望的格式
formatted_data = {
'city': weather_data['city'],
'temperature': weather_data['current']['temp'],
'description': weather_data['current']['weather'],
'humidity': weather_data['current']['humidity'],
'wind_scale': weather_data['current']['wind_scale']
}
print(f"格式化后的数据: {formatted_data}")
self.update_weather_display(formatted_data)
# 直接传递原始数据update_weather_display会处理嵌套结构
self.update_weather_display(weather_data)
else:
print(f"无法获取城市 {city} 的天气数据")
@ -205,7 +197,8 @@ class WordStyleMainWindow(QMainWindow):
'temperature': weather_data['current']['temp'],
'description': weather_data['current']['weather'],
'humidity': weather_data['current']['humidity'],
'wind_scale': weather_data['current']['wind_scale']
'wind_scale': weather_data['current']['wind_scale'],
'life_tips': weather_data.get('life_tips', [])
}
print(f"格式化后的数据: {formatted_data}")
self.update_weather_display(formatted_data)
@ -929,25 +922,34 @@ class WordStyleMainWindow(QMainWindow):
def update_weather_display(self, weather_data):
"""更新天气显示"""
print(f"接收到天气数据: {weather_data}")
if 'error' in weather_data:
print(f"天气显示错误: {weather_data['error']}")
self.status_bar.showMessage(f"天气数据获取失败: {weather_data['error']}", 3000)
else:
# 处理嵌套的天气数据结构
city = weather_data.get('city', '未知城市')
temp = weather_data.get('temperature', 'N/A')
desc = weather_data.get('description', 'N/A')
humidity = weather_data.get('humidity', 'N/A')
wind_scale = weather_data.get('wind_scale', 'N/A')
# 从current字段获取温度和天气状况
current_data = weather_data.get('current', {})
temp = current_data.get('temp', 'N/A')
desc = current_data.get('weather', 'N/A')
# 获取温度范围信息
temp_range = ""
if 'forecast' in weather_data and weather_data['forecast']:
forecast_data = weather_data['forecast'][0] # 今天的预报
if isinstance(forecast_data, dict):
temp_max = forecast_data.get('temp_max', 'N/A')
temp_min = forecast_data.get('temp_min', 'N/A')
if temp_max != 'N/A' and temp_min != 'N/A':
temp_range = f" ({temp_min}°C~{temp_max}°C)"
# 在状态栏显示简要天气信息
weather_message = f"{city}: {desc}, {temp}°C, 湿度{humidity}%, 风力{wind_scale}"
print(f"显示天气信息: {weather_message}")
weather_message = f"{city}: {desc}, {temp}°C{temp_range}"
self.status_bar.showMessage(weather_message, 5000)
# 存储天气数据供其他功能使用
# 存储天气数据供其他功能使用(确保包含生活提示)
self.current_weather_data = weather_data
print("天气数据已存储")
print(f"update_weather_display - 存储的current_weather_data包含life_tips: {self.current_weather_data.get('life_tips', [])}")
def refresh_weather(self):
"""手动刷新天气信息"""
@ -964,15 +966,15 @@ class WordStyleMainWindow(QMainWindow):
weather_data = self.weather_api.get_weather_data(current_city)
if weather_data:
# 格式化天气数据
# 格式化天气数据为扁平结构便于update_weather_display使用
formatted_data = {
'city': weather_data['city'],
'temperature': weather_data['current']['temp'],
'description': weather_data['current']['weather'],
'humidity': weather_data['current']['humidity'],
'wind_scale': weather_data['current']['wind_scale'],
'forecast': weather_data['forecast']
'current': weather_data['current'],
'forecast': weather_data['forecast'],
'life_tips': weather_data.get('life_tips', [])
}
print(f"refresh_weather - 原始数据包含life_tips: {weather_data.get('life_tips', [])}")
print(f"refresh_weather - formatted_data包含life_tips: {formatted_data.get('life_tips', [])}")
self.update_weather_display(formatted_data)
self.status_bar.showMessage("天气数据已刷新", 2000)
else:
@ -990,6 +992,7 @@ class WordStyleMainWindow(QMainWindow):
return
weather_data = self.current_weather_data
print(f"详细天气对话框 - 天气数据: {weather_data}")
# 创建对话框
dialog = QDialog(self)
@ -1006,11 +1009,26 @@ class WordStyleMainWindow(QMainWindow):
current_layout = QVBoxLayout()
current_layout.addWidget(QLabel("<b>当前天气:</b>"))
# 获取温度信息,支持嵌套结构
current_data = weather_data.get('current', {})
temp = current_data.get('temp', 'N/A')
if temp != 'N/A' and isinstance(temp, str):
temp = float(temp) if temp.replace('.', '').isdigit() else temp
# 从预报数据中获取最高和最低气温
temp_max = 'N/A'
temp_min = 'N/A'
if 'forecast' in weather_data and weather_data['forecast']:
forecast_data = weather_data['forecast'][0] # 今天的预报
if isinstance(forecast_data, dict):
temp_max = forecast_data.get('temp_max', 'N/A')
temp_min = forecast_data.get('temp_min', 'N/A')
current_info = f"""
温度: {weather_data.get('temperature', 'N/A')}°C
天气状况: {weather_data.get('description', 'N/A')}
湿度: {weather_data.get('humidity', 'N/A')}%
风力: {weather_data.get('wind_scale', 'N/A')}
当前温度: {temp}°C
最高气温: {temp_max}°C
最低气温: {temp_min}°C
天气状况: {current_data.get('weather', 'N/A')}
"""
current_text = QTextEdit()
current_text.setPlainText(current_info.strip())
@ -1019,22 +1037,23 @@ class WordStyleMainWindow(QMainWindow):
layout.addLayout(current_layout)
# 天气预报信息
if 'forecast' in weather_data and weather_data['forecast']:
forecast_layout = QVBoxLayout()
forecast_layout.addWidget(QLabel("<b>天气预报:</b>"))
# 生活提示信息(替换原来的天气预报)
life_tips = weather_data.get('life_tips', [])
print(f"详细天气对话框 - 生活提示: {life_tips}")
print(f"详细天气对话框 - 完整天气数据: {weather_data}")
if life_tips:
tips_layout = QVBoxLayout()
tips_layout.addWidget(QLabel("<b>生活提示:</b>"))
forecast_text = QTextEdit()
forecast_info = ""
for i, day in enumerate(weather_data['forecast'][:3]): # 显示最近3天的预报
if i < len(weather_data['forecast']):
day_data = weather_data['forecast'][i]
forecast_info += f"{i+1}天: {day_data.get('fxDate', 'N/A')} - {day_data.get('textDay', 'N/A')}, {day_data.get('tempMin', 'N/A')}~{day_data.get('tempMax', 'N/A')}°C\n"
tips_text = QTextEdit()
tips_info = ""
for tip in life_tips:
tips_info += f"{tip}\n"
forecast_text.setPlainText(forecast_info.strip())
forecast_text.setReadOnly(True)
forecast_layout.addWidget(forecast_text)
layout.addLayout(forecast_layout)
tips_text.setPlainText(tips_info.strip())
tips_text.setReadOnly(True)
tips_layout.addWidget(tips_text)
layout.addLayout(tips_layout)
# 按钮
button_layout = QHBoxLayout()

Loading…
Cancel
Save