parent
3baa3203c0
commit
1530a7dd9a
|
|
@ -15,7 +15,7 @@ class Dashboard(QWidget):
|
|||
self.setStyleSheet("background-color: black;")
|
||||
self.cards = {}
|
||||
|
||||
theme = "normal" # "light", "normal", "dark"
|
||||
theme = "dark" # "light", "normal", "dark"
|
||||
|
||||
colors = {
|
||||
"cpu": {"light": "#ffcccc", "normal": "#cc6666", "dark": "#662222"},
|
||||
|
|
@ -110,8 +110,15 @@ if __name__ == "__main__":
|
|||
print("사용 가능한 모니터 수:", len(screens))
|
||||
|
||||
# 예: 두 번째 모니터 선택 (인덱스 1)
|
||||
target_screen_index = 1 if len(screens) > 1 else 0
|
||||
target_screen = screens[target_screen_index]
|
||||
##target_screen_index = 1 if len(screens) > 1 else 0
|
||||
## target_screen = screens[target_screen_index]
|
||||
|
||||
# 예시: 무조건 세 번째 모니터 (인덱스 2)에 띄우고 싶다면
|
||||
target_screen_index = 1
|
||||
if len(screens) > target_screen_index:
|
||||
target_screen = screens[target_screen_index]
|
||||
else:
|
||||
print(f"Warning: Monitor index {target_screen_index} not found.")
|
||||
|
||||
# 선택한 모니터의 geometry로 이동
|
||||
geometry = target_screen.geometry()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
# run_daqtshboard.sh
|
||||
# 홈 디렉토리나 적절한 위치에 이 스크립트를 저장합니다.
|
||||
|
||||
# 가상 환경이 있다면 활성화 (선택 사항)
|
||||
source /home/mkpark/pyqt6Dashboard/.venv/bin/activate
|
||||
|
||||
# 대시보드 파일이 있는 디렉토리로 이동
|
||||
cd /home/mkpark/pyqt6Dashboard/qtDash
|
||||
|
||||
python3 main.py
|
||||
|
|
@ -0,0 +1,177 @@
|
|||
import sys
|
||||
from PyQt6.QtWidgets import (
|
||||
QApplication,
|
||||
QMainWindow,
|
||||
QStackedWidget,
|
||||
QWidget,
|
||||
QVBoxLayout,
|
||||
QLabel,
|
||||
QSizePolicy
|
||||
)
|
||||
|
||||
from PyQt6.QtGui import QGuiApplication
|
||||
from PyQt6.QtCore import QTimer, QDateTime, Qt, QUrl
|
||||
from PyQt6.QtGui import QFont, QColor, QPalette
|
||||
from PyQt6.QtWebEngineWidgets import QWebEngineView
|
||||
|
||||
# --- 1. 동영상 재생 화면 (QWebEngineView 사용) ---
|
||||
class VideoPlayerScreen(QWidget):
|
||||
def __init__(self, video_url):
|
||||
super().__init__()
|
||||
self.layout = QVBoxLayout(self)
|
||||
self.web_view = QWebEngineView()
|
||||
|
||||
# 외부 URL을 로드합니다. (전체화면 지원)
|
||||
self.web_view.setUrl(QUrl(video_url))
|
||||
|
||||
self.layout.addWidget(self.web_view)
|
||||
self.layout.setContentsMargins(0, 0, 0, 0)
|
||||
|
||||
# 배경색 설정 (선택 사항)
|
||||
self.setAutoFillBackground(True)
|
||||
palette = self.palette()
|
||||
palette.setColor(QPalette.ColorRole.Window, QColor(0, 0, 0)) # 검은색 배경
|
||||
self.setPalette(palette)
|
||||
|
||||
# 웹뷰가 전체를 차지하도록 설정
|
||||
self.web_view.setSizePolicy(
|
||||
QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding
|
||||
)
|
||||
|
||||
|
||||
# --- 2. 시계 + 사진 화면 (QLabel과 QTimer 사용) ---
|
||||
class ClockPhotoScreen(QWidget):
|
||||
def __init__(self, image_url):
|
||||
super().__init__()
|
||||
self.layout = QVBoxLayout(self)
|
||||
self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
self.layout.setSpacing(50)
|
||||
|
||||
# 1. 시계 레이블 설정
|
||||
self.time_label = QLabel()
|
||||
self.time_label.setFont(QFont("Arial", 120, QFont.Weight.Bold))
|
||||
self.time_label.setStyleSheet("color: white;")
|
||||
self.time_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
self.layout.addWidget(self.time_label)
|
||||
|
||||
# 2. 사진/배경 설정
|
||||
# 이미지 대신 간단한 배경색과 중앙 텍스트를 사용합니다.
|
||||
# 실제 이미지 로딩은 QPixmap이나 QNetworkAccessManager를 사용해야 하며,
|
||||
# 복잡도를 낮추기 위해 여기서는 배경색을 사용합니다.
|
||||
self.setStyleSheet("background-color: #34495e;") # 진한 파란색 계열 배경
|
||||
|
||||
# 이미지 URL을 참고용으로만 표시
|
||||
self.photo_info = QLabel("사진/배경 모드 (실제 이미지 URL: " + image_url + ")")
|
||||
self.photo_info.setFont(QFont("Arial", 20))
|
||||
self.photo_info.setStyleSheet("color: #ecf0f1;") # 밝은 회색 텍스트
|
||||
self.photo_info.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
self.layout.addWidget(self.photo_info)
|
||||
|
||||
# 타이머 설정 (1초마다 시간 업데이트)
|
||||
self.timer = QTimer(self)
|
||||
self.timer.timeout.connect(self.update_time)
|
||||
self.timer.start(1000)
|
||||
self.update_time()
|
||||
|
||||
def update_time(self):
|
||||
# 현재 시간을 'HH:MM:SS' 형식으로 표시
|
||||
current_time = QDateTime.currentDateTime().toString("HH:mm:ss\nyyyy.MM.dd (ddd)")
|
||||
self.time_label.setText(current_time)
|
||||
|
||||
|
||||
# --- 3. 구글 캘린더 웹뷰 화면 (QWebEngineView 사용) ---
|
||||
class CalendarWebViewScreen(QWidget):
|
||||
def __init__(self, calendar_url):
|
||||
super().__init__()
|
||||
self.layout = QVBoxLayout(self)
|
||||
self.web_view = QWebEngineView()
|
||||
|
||||
# 사용자의 공개 캘린더 임베드 URL로 변경해야 합니다.
|
||||
self.web_view.setUrl(QUrl(calendar_url))
|
||||
|
||||
self.layout.addWidget(self.web_view)
|
||||
self.layout.setContentsMargins(0, 0, 0, 0)
|
||||
|
||||
|
||||
# --- 메인 대시보드 창 (전체 화면 및 모드 전환 관리) ---
|
||||
class FullScreenDashboard(QMainWindow):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setFixedSize(960, 640)
|
||||
self.setWindowTitle("다이나믹 대시보드 샘플")
|
||||
|
||||
# 샘플 리소스 URL 설정
|
||||
VIDEO_URL = "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
|
||||
IMAGE_URL = "http://googleusercontent.com/image_collection/image_retrieval/7567987077819350991"
|
||||
|
||||
# 실제 사용 시 {YOUR_CALENDAR_ID}를 사용자 캘린더 ID로 교체해야 합니다.
|
||||
CALENDAR_URL = "https://calendar.google.com/calendar/embed?mode=AGENDA&src=ko.south_korea%23holiday%40group.v.calendar.google.com&ctz=Asia/Seoul"
|
||||
|
||||
# QStackedWidget 생성 (화면 전환을 위한 핵심 위젯)
|
||||
self.stacked_widget = QStackedWidget()
|
||||
self.setCentralWidget(self.stacked_widget)
|
||||
|
||||
# 각 화면 인스턴스 생성 및 스택에 추가
|
||||
self.video_screen = VideoPlayerScreen(VIDEO_URL)
|
||||
self.clock_photo_screen = ClockPhotoScreen(IMAGE_URL)
|
||||
self.calendar_screen = CalendarWebViewScreen(CALENDAR_URL)
|
||||
|
||||
self.stacked_widget.addWidget(self.video_screen) # 인덱스 0 (모드 1)
|
||||
self.stacked_widget.addWidget(self.clock_photo_screen) # 인덱스 1 (모드 2)
|
||||
self.stacked_widget.addWidget(self.calendar_screen) # 인덱스 2 (모드 3)
|
||||
|
||||
# 초기 화면 설정 (모드 1)
|
||||
self.stacked_widget.setCurrentIndex(0)
|
||||
|
||||
# 전체 화면으로 표시
|
||||
self.showFullScreen()
|
||||
|
||||
# 키 입력 이벤트를 오버라이드하여 모드 전환 처리
|
||||
def keyPressEvent(self, event):
|
||||
key = event.key()
|
||||
|
||||
if key == Qt.Key.Key_Escape:
|
||||
# Esc 키를 누르면 애플리케이션 종료
|
||||
self.close()
|
||||
elif key == Qt.Key.Key_1:
|
||||
# 1 키: 동영상 재생 화면
|
||||
self.stacked_widget.setCurrentIndex(0)
|
||||
print("모드 전환: 1. 동영상 재생 샘플")
|
||||
elif key == Qt.Key.Key_2:
|
||||
# 2 키: 시계 + 사진 화면
|
||||
self.stacked_widget.setCurrentIndex(1)
|
||||
print("모드 전환: 2. 시계 + 사진 샘플")
|
||||
elif key == Qt.Key.Key_3:
|
||||
# 3 키: 구글 캘린더 웹뷰
|
||||
self.stacked_widget.setCurrentIndex(2)
|
||||
print("모드 전환: 3. 구글 캘린더 웹뷰")
|
||||
|
||||
super().keyPressEvent(event)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = QApplication(sys.argv)
|
||||
# window = FullScreenDashboard()
|
||||
# 윈도우 생성
|
||||
dashboard = FullScreenDashboard()
|
||||
|
||||
# 1. 사용 가능한 모니터 목록 가져오기
|
||||
screens = QGuiApplication.screens()
|
||||
# 2. 더미 모니터 선택 (예: 두 번째 모니터, 인덱스 1)
|
||||
# target_screen_index = 1 if len(screens) > 1 else 0
|
||||
# target_screen = screens[target_screen_index]
|
||||
|
||||
target_screen_index = 0
|
||||
if len(screens) > target_screen_index:
|
||||
target_screen = screens[target_screen_index]
|
||||
else:
|
||||
print(f"Warning: Monitor index {target_screen_index} not found.")
|
||||
|
||||
|
||||
# 3. 윈도우를 선택한 모니터의 좌측 상단으로 이동
|
||||
geometry = target_screen.geometry()
|
||||
dashboard.move(geometry.x(), geometry.y())
|
||||
|
||||
# 4. 고정된 960x640 크기로 표시
|
||||
dashboard.show()
|
||||
sys.exit(app.exec())
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 470 KiB |
Loading…
Reference in New Issue