디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[💡답변] 아래 (58.238) 답변

ㅇㅇ(112.221) 2024.01.31 16:10:48
조회 142 추천 0 댓글 0
														
import os
import sys
import datetime
from itertools import zip_longest

import openpyxl
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QGridLayout,
QWidget,
QFileDialog,
QPushButton,
QLabel,
QLineEdit,
)
from PyQt6.QtCore import (
Qt,
QThread,
pyqtSignal,
pyqtSlot,
)

if getattr(sys, "frozen", False):
BASE_DIR = sys._MEIPASS
else:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

class WorkerThread(QThread):
error_B5 = pyqtSignal(str)
error_G14 = pyqtSignal(str)
error_G15 = pyqtSignal(str)
ERROR_DICT = {
FileNotFoundError: "The selected file does not exist.",
UnicodeDecodeError: "The selected file is not a text file.",
PermissionError: "The selected file is being used by another program.",
}

def __init__(self, template_path, B5_path, G14_path, G15_path, parent=None):
super().__init__()
self._template_path = template_path
self._B5_path = B5_path
self._G14_path = G14_path
self._G15_path = G15_path

@property
def template_path(self) -> str:
return self._template_path

@property
def B5_path(self) -> str:
return self._B5_path

@property
def G14_path(self) -> str:
return self._G14_path

@property
def G15_path(self) -> str:
return self._G15_path

@staticmethod
def _loadTextFile(text_path: str, signal: pyqtSignal) -> list[str]:
if not text_path:
return []
try:
with open(text_path, 'r', encoding='utf-8') as txt_file:
lines = txt_file.readlines()
entries = [line.strip() for line in lines]
return entries
except Exception as e:
signal.emit(WorkerThread.ERROR_DICT.get(type(e), str(e)))
return []

def run(self):
self.B5_entries = self._loadTextFile(self.B5_path, self.error_B5)
self.G14_entries = self._loadTextFile(self.G14_path, self.error_G14)
self.G15_entries = self._loadTextFile(self.G15_path, self.error_G15)

for i, (B5, G14, G15) in enumerate(zip_longest(self.B5_entries, self.G14_entries, self.G15_entries, fillvalue=''), 1):
template_wb = openpyxl.load_workbook(self.template_path)
template_ws = template_wb.active
template_ws['B5'].value = B5
template_ws['G14'].value = G14
template_ws['G15'].value = G15

dir_name = os.path.dirname(self.template_path)
base_name = os.path.basename(self.template_path)
name, ext = os.path.splitext(base_name)
current_time = datetime.datetime.now().strftime("%y%m%d%H%M%S%f")[:-3]
new_file_name = f"{name}_{i}_{current_time}{ext}"
new_file_path = os.path.join(dir_name, new_file_name)

try:
template_wb.save(new_file_path)
finally:
template_wb.close()

class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Excel Filler")
self.setFixedSize(500, 200)
self.setWindowFlags(self.windowFlags() & ~Qt.WindowType.WindowMaximizeButtonHint)
self.initUI()
self.worker = None

def initUI(self):
if not self.centralWidget():
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
self.central_layout = QGridLayout(self.centralWidget())

self.template_edit = self.createFileSelectionRow("Template File", 0)
self.template_edit.textChanged.connect(self.checkTemplateFile)
self.B5_edit = self.createFileSelectionRow("B5 File", 1)
self.G14_edit = self.createFileSelectionRow("G14 File", 2)
self.G15_edit = self.createFileSelectionRow("G15 File", 3)

self.start_button = QPushButton("Start")
self.start_button.setEnabled(False)
self.start_button.setAutoDefault(True)
self.start_button.clicked.connect(self.startClicked)
self.start_button.clicked.connect(lambda: self.start_button.setEnabled(False))
self.central_layout.addWidget(self.start_button, 4, 0, 1, 3)

def createFileSelectionRow(self, label_text, row_index) -> QLineEdit:
file_label = QLabel(label_text)
self.central_layout.addWidget(file_label, row_index, 0)

file_edit = QLineEdit()
file_edit.setReadOnly(True)
file_edit.setFocusPolicy(Qt.FocusPolicy.NoFocus)
file_edit.setStyleSheet('QLineEdit[ErrorFlag=true]{color: red;}')
self.central_layout.addWidget(file_edit, row_index, 1)

file_button = QPushButton("...")
file_button.setMaximumWidth(30)
file_button.clicked.connect(lambda: self.selectFile(file_edit))
self.central_layout.addWidget(file_button, row_index, 2)

return file_edit


    @pyqtSlot(QLineEdit)

def selectFile(self, line_edit):

file_path, _ = QFileDialog.getOpenFileName(
parent=self,
caption="Select File",
directory=f"{BASE_DIR}",
filter="Excel file (*.xlsx *.xls *.xlsm *.cell *.csv);;" if line_edit == self.template_edit else "Text file (*.txt)",
initialFilter=None,
options=QFileDialog.Option.DontUseNativeDialog
)
if file_path:
line_edit.setText(file_path)
line_edit.setProperty("ErrorFlag", False)
line_edit.style().unpolish(line_edit)
line_edit.style().polish(line_edit)

@pyqtSlot(str)
def checkTemplateFile(self, text):
if text:
self.start_button.setEnabled(True)
else:
self.start_button.setEnabled(False)

@pyqtSlot(bool)
def startClicked(self, stat):
if self.worker is None or not self.worker.isRunning():
self.worker = WorkerThread(
self.template_edit.text(),
self.B5_edit.text(),
self.G14_edit.text(),
self.G15_edit.text()
)
self.worker.error_B5.connect(self.updateB5)
self.worker.error_G14.connect(self.updateG14)
self.worker.error_G15.connect(self.updateG15)
self.worker.finished.connect(lambda: self.start_button.setEnabled(True))
self.worker.start()

@pyqtSlot(str)
def updateB5(self, text):
self.B5_edit.setText(text)
self.B5_edit.setProperty("ErrorFlag", True)
self.B5_edit.style().unpolish(self.B5_edit)
self.B5_edit.style().polish(self.B5_edit)

@pyqtSlot(str)
def updateG14(self, text):
self.G14_edit.setText(text)
self.G14_edit.setProperty("ErrorFlag", True)
self.G14_edit.style().unpolish(self.G14_edit)
self.G14_edit.style().polish(self.G14_edit)

@pyqtSlot(str)
def updateG15(self, text):
self.G15_edit.setText(text)
self.G15_edit.setProperty("ErrorFlag", True)
self.G15_edit.style().unpolish(self.G15_edit)
self.G15_edit.style().polish(self.G15_edit)



if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())


메일로 보냈는데 이게 더 최신임


코드 지적 시 님들이 맞음

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
- 설문 해외에서 겪는 불합리한 대우에 대응 잘 할 것 같은 스타는? 운영자 25/11/03 - -
- AD 저녁 뭐먹지? 오늘의 메뉴 추천! 운영자 25/10/31 - -
635 공지 가독성 좋은 f-string 을 쓰자 [9] 주넹갤로그로 이동합니다. 21.10.02 3610 10
1056 공지 (공지 요청)[질문지 양식] 복붙해 쓰시오. [4] 203.121.116.11갤로그로 이동합니다. 21.12.14 2523 5
634 공지 질문 올릴때 [2] 주넹갤로그로 이동합니다. 21.10.02 2676 5
178 공지 파이썬 공부할 때 참고할만한 것들 [7] 주넹갤로그로 이동합니다. 21.04.21 8318 7
1 공지 파이썬 미니 갤러리입니다. [9] 주넹갤로그로 이동합니다. 20.12.14 3424 7
2627 일반 진짜 코딩 과제 감을 못잡겠음 [4] ㅇㅇ(118.235) 10.31 32 0
2626 일반 ㄴㄷㅋㄷ 이거 5년전거 아님? 5년 전거로 공부해도되는거야? ㅇㅇ(118.37) 10.25 20 0
2625 일반 맥OS로 공부하는거 별로일까요? [1] ㅇㅇ(118.37) 10.25 32 0
2624 일반 입문 파이썬 공부하려는데요 인강좀 추천해주세요! ㅇㅇ(118.37) 10.25 43 0
2623 일반 코딩 1도 모르는데 [5] ㅇㅇ(119.199) 10.13 84 0
2622 🔎질문 셀레니움 값이 입력이 안되는 현상이 있습니다 ㅇㅇ(39.124) 10.09 49 0
2621 일반 혼자공부하는파이썬 점프투파이썬 [1] ㅇㅇ(211.246) 09.18 152 0
2620 일반 님들이 싫어하는거 사용자 이름 없음(182.228) 08.05 87 0
2619 🔎질문 고등학생인데 질문 있어요. [3] ㅇㅇ(118.221) 07.30 163 0
2618 🔎질문 셀레니움으로 이미지 직접 다운로드 하는 방법 [1] ㅇㅇ(39.7) 07.14 96 0
2617 일반 ㄴㄷㅋㄷ 6시간짜리 5년전꺼라 버전이 달라서 어려움 [1] 빨간망토갤로그로 이동합니다. 05.30 181 0
2616 일반 파이썬 아다 떼려면 책 필요없고 ㄴㄷㅋㄷ 보면됨? [2] 빨간망토갤로그로 이동합니다. 05.23 329 0
2615 일반 7월부터 C언어 파이썬 동시에 해야하는데 [3] ㅇㅇ(118.235) 05.19 169 0
2614 🔎질문 라즈베리파이 프로그램 관련 질문 [2] ㅇㅇ(59.25) 05.04 129 0
2613 일반 에라토스테네스-신촌우왕 체식 신촌우왕갤로그로 이동합니다. 04.22 368 0
2612 일반 카메라 영상을 파이썬 flet으로 실시간 출력 작성 해보신분 [2] ㅇㅇ(218.150) 04.03 195 0
2611 🔎질문 혼자 공부하기 파이썬 책 추천좀 해주세요 [2] 토리짜갤로그로 이동합니다. 03.31 326 0
2610 일반 루트 k의 근사값 [1] 신촌우왕갤로그로 이동합니다. 03.28 183 0
2609 일반 루트 2의 근사값 [1] 신촌우왕갤로그로 이동합니다. 03.28 644 0
2608 일반 짝수 완전수 신촌우왕갤로그로 이동합니다. 03.28 113 0
2606 일반 유클리드 호제법 신촌우왕갤로그로 이동합니다. 03.22 148 0
2605 일반 비전공자 생초보 입문자 점프 투 파이썬으로 하면 되나여? [1] ㅇㅇ(223.39) 03.18 490 0
2604 일반 Int로 변환했는데 이구 왜이럴까요 [3] ㅇㅇ(210.126) 03.15 227 0
2603 일반 이거 어떻게 쳐요,,? [2] ㅇㅇ(221.154) 03.13 229 1
2602 🔎질문 고수님들 대학 파이썬 수업듣는데 질문 있어서 왔습니다 ㅠㅠ [2] ㅇㅇ(39.124) 03.11 256 0
2601 일반 파이썬으로 데이터 변형 하고 있는데 [3] ㅇㅇ(221.152) 03.08 195 1
2600 일반 게임에서 마우스 좌표는 다 잘 찍히는데 키보드가 안됨 ㅇㅇ(59.20) 03.04 154 0
2598 🔎질문 누가 좀 도와줘... [2] ㅇㅇ(115.138) 02.07 257 0
2596 🔎질문 점프투파이썬 굳이 책 사야 하나요? [2] 애개뤼를쮀에에엑갤로그로 이동합니다. 24.12.23 696 0
2595 일반 파이썬 윈도우앱에 광고달아보신분..? ㅇㅇ(222.236) 24.12.18 217 0
2594 일반 파이썬 모바일 추천 좀 ㅇㅇ(110.11) 24.12.08 243 0
2593 일반 r스튜디오 도와주십쇼 형님들.. [2] ㅇㅇ(121.154) 24.12.05 295 0
2591 일반 조졌다 [1] delegen(121.181) 24.11.18 272 0
2590 🔎질문 대학 입학전에 파이썬 공부해볼라고 하는데 [2] ㅇㅇ(110.10) 24.11.17 506 0
2589 일반 파이썬 이래 배우면 되나요?? [1] ㅇㅇ(119.195) 24.11.12 462 0
2588 🔎질문 가상환경 라이브러리 글로벌 문제 ㅇㅇ(123.214) 24.11.05 225 0
2587 일반 도와주세요 고수님들 [2] ㅇㅇ(118.217) 24.11.03 350 0
2586 일반 챗GPT 개같네 [2] 초보 파갤러(119.203) 24.10.27 492 0
2585 일반 파이썬 뭐 부터 건드려야함? 정처기 보유 [1] ㅇㅇ(118.216) 24.10.24 355 0
2582 일반 점프투파이썬이랑 나도코딩 입문강의중에 뭐 봐야함? [2] ㅇㅇ(118.235) 24.10.09 551 0
2581 일반 아이패드로 파이썬 [1] 쪼물갤로그로 이동합니다. 24.10.05 294 0
2580 일반 욜로yolo 객체학습 이후에 질문이 있습니다. [1] ㅇㅇ(117.52) 24.10.05 301 0
2579 일반 파이썬 초보 책추천 [20] 쪼물갤로그로 이동합니다. 24.10.05 5515 0
2577 일반 파린이 도와주세요 ㅠㅠ [2] ㅇㅇ(106.102) 24.10.03 286 0
2576 일반 ai로 댓글 다는거 [2] ㅇㅇ(220.95) 24.09.30 299 0
2575 일반 형님들 파이선 입문을 어떻게해야 좋을까요? [4] ㅇㅇ(106.101) 24.09.26 383 0
2574 일반 질문)본인:쌩초보, 나도코딩 따라 중, 목표는 객체인식, 적용은 시골축사 [12] ㅇㅇ(211.117) 24.09.25 479 0
2572 일반 fastapi 만든사람 콜롬비아 출신 고졸임 [1] ㅇㅇ갤로그로 이동합니다. 24.09.15 334 1
2570 🔎질문 도와주세요 파이참 실행이 아예 안되요 ㅠㅠ... [2] ㅇㅇ(211.252) 24.09.02 299 0
2569 일반 pygbag 아시는 분 ㅇㅇ(183.109) 24.08.20 226 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2