25%
49,500원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
pip 설치가 되지 않습니다.
크롤링 세번째 강의 듣는 도중 requests를 깔아야 하는데 이렇게 뜨는데 어떻게 해야 하나요
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
소스코드를 어디서 볼 수 있나요??
제가 강의를 다 안봐서 강의 중간에 말하셨을수도 있는데, 소스코드가 어디잇는지 찾을수가 없네요 ㅠㅠ
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
파이썬 for 문 관련 질문있습니다.
파이썬 for 문을 사용하다가 제가 사용한 방식이 권장하지 않는다고 해서 질문드립니다. list =[1,2,3,4,5] for x in range(len(list)): print list[x] print x 이렇게 사용하고 있었는데 for x , y in enumerates(list): print x,y 이 방법을 추천하던데 이유가 있을까요?? for 문을 만들때 저는 몇번돌려야지란 생각때문에 첫번째 코드로 작업을 하고있었는데 두번쨰 방법으로 권장한다고 인터넷에 써있어서 왜그런가 그리고 제가 하는방법에 문제점이 혹시 없나 해서 질문드립니다.
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
도저희 이해가 안가네요..
제 머리를 탓해야겠지요 ㅠㅠ 이 부분은 일단 그냥 넘어가야겠네요. while True: num = input("2 이상의 숫자를 입력하세요") if not num.isnumeric: continue num = int(num) if num < 2: continue break prime_list = [False, False] + [True] * (num - 1) primes = [] for i in range(2, num + 1): if prime_list[i]: for j in range(2 * i, num + 1, i): # 소수가 아니면 False prime_list[j] = False primes = [i for i in range(2, num+1) if prime_list[i] == True] print(primes) if num in primes: print("소수에요.") else: print("소수가 아닙니다.")
- 해결됨남박사의 파이썬 기초부터 실전 100% 활용
지능형 로또 번호 생성기 질문 있습니다.
마지막 3번째 연속된 자리수를 뽑아낼 때 continuity 값을 6을 넣을 경우에는 45를 초과하는 숫자도 나오는거 아닌가요? 제가 뭘 빼먹은건지 모르겠는데 강의 보면서 똑같이 따라한거 같은데 저는 연속된 숫자가 45를 넘어가는 경우가 생깁니다. 코드에서 45를 넘지 않게 하는 부분이 어딨는지 아무리 봐도 없는거 같은데... 아닌가요? 아 넘어가지 않게끔 하는 방법은 혼자 연습해서 해봤으니 방법은 안알려주셔도 됩니다만 제가 뭘 빼먹은건지 궁금해서 질문드립니다..
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
안녕하세요? 막막한 문제에 직면해서 질문드립니다
"ResizeObserver loop limit exceeded"라는 에러떄문에 어제부터 골머리를 앓고있습니다 ㅠ 인스타그램에 로그인한뒤 좋아요와 댓글을다는 프로그램인데요, 로그인까지는 무리없이 되는데 상대방의 인스타그램 피드에 들어가고 좋아요를 누르는 와중에 터미널창에 "ResizeObserver loop limit exceeded"가 뜨며 실행창이 응답없음이 뜹니다 구글링해보니 크롬이 가지고있는 문제라고 하는데 해결법을 알수가 없습니다 ㅠㅠ 본인의 인스타 아이디 비번을 입력해 로그인한뒤 새로운 창이 열리고 상대의 아이디를 입력하여 '좋아요'를 클릭하면 상대의 페이지로 들어간뒤 첫 게시글을 클릭하여 좋아요와 댓글을다는 순서입니다. 코드입니다. from selenium import webdriver from PyQt5 import QtWidgets from PyQt5 import QtCore from PyQt5.QtWidgets import QToolButton, QSizePolicy, QLabel, QLineEdit,QPushButton import random import keyboard import re options=webdriver.ChromeOptions() options.add_argument('headless')#창을 안띄우는 headless모드 options.add_argument('window-size=1920x1080') options.add_argument("disable-gpu")#gpu가속 끔 #user-agent값을 변경하여 headless모드 감지를 방지 options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36") options.add_argument("lang=ko_KR") #headless모드에선 언어설정이 안되있으므로 한국어로 설정(감지 방지) driver = webdriver.Chrome('C:\\Users\\User\\Downloads\\chromedriver_win32\\chromedriver.exe',chrome_options=options) class start(QtWidgets.QWidget): def __init__(self): super().__init__() self.layout=QtWidgets.QHBoxLayout(self) self.id_layout = QtWidgets.QVBoxLayout(self) self.pwd_layout = QtWidgets.QVBoxLayout(self) #QV=가로 QH=세로 self.id=QLabel("ID") self._id=QLineEdit() self.pwd=QLabel("password") self._pwd=QLineEdit() self.id_layout.addWidget(self.id) self.id_layout.addWidget(self._id) self.pwd_layout.addWidget(self.pwd) self.pwd_layout.addWidget(self._pwd) self.layout.addLayout(self.id_layout) self.layout.addLayout(self.pwd_layout) self.setLayout(self.layout) self._pwd.setEchoMode(QLineEdit.Password) self._pwd.returnPressed.connect(self.login) self.show() def login(self): driver.get("https://www.instagram.com/accounts/login/") driver.implicitly_wait(10) driver.find_element_by_name('username').send_keys(self._id.text()) driver.find_element_by_name('password').send_keys(self._pwd.text()) driver.implicitly_wait(10) driver.find_elements_by_tag_name('button')[1].click() driver.implicitly_wait(100) self.newWindow = Main() self.newWindow.show() self.close() class Main(QtWidgets.QWidget): def __init__(self): super().__init__() self.layout_m = QtWidgets.QHBoxLayout(self) #전체틀 self.start_layout = QtWidgets.QVBoxLayout() #버튼을 담을 틀 self.setFixedSize(300, 200) self.target=QLabel("상대의 아이디를 입력하세요") self._target=QLineEdit() self._target.returnPressed.connect(self.targetID) self.like = self.createButton("좋아요",self.clicklike) self.like.resize(self.like.sizeHint()) self.start_layout.addWidget(self.target) self.start_layout.addWidget(self._target) self.layout_m.addLayout(self.start_layout)#전체틀에 버튼을 담은 틀을 담음 self.layout_m.addWidget(self.like) self.setLayout(self.layout_m) self.show() def createButton(self, text, function): button = Button(text) button.clicked.connect(function) return button def targetID(self): self.target_name=self._target.text() driver.get('https://www.instagram.com/{}'.format(self.target_name)) def clicklike(self): #첫번째 게시글 클릭 driver.find_elements_by_css_selector('.v1Nh3.kIKUG._bz0w')[0].find_element_by_tag_name('a').click() driver.implicitly_wait(10) #좋아요누르기 driver.get(driver.current_url) temp1=driver.find_elements_by_class_name('eo2As ') temp1[0].find_element_by_class_name('wpO6b ').click() #사진의 정보가져와서 필요한데이터 추출 img_information=driver.find_elements_by_tag_name('img')[1].get_attribute('alt') img_information=img_information.split(': ') img_information=img_information[1].split(' and ') food = ["맛있겠네","맛있어 보이는구나!","다음에 나도 데려가~~", "돼지야!"] people=["오 아주 잘나왔군!", "정말 멋쟁이군", "우도환 닮았다", "손나은 닮았다"] for i in img_information: if re.search('people',i): case="인물" break if re.search('food',i): case="음식" break else: case="기타" if case=="인물": rand_number=random.randint(0,3) comment=people[rand_number] elif case=="음식": rand_number=random.randint(0,3) comment=food[rand_number] else: comment="^^7" #댓글입력 temp1[0].find_elements_by_class_name('wpO6b ')[1].click() driver.find_element_by_tag_name('textarea').send_keys(comment) driver.implicitly_wait(10) driver.find_element_by_class_name('X7cDz').find_element_by_tag_name('button').click() #계산기만들기의 코드 가져옴 class Button(QToolButton): def __init__(self, text): super().__init__() buttonStyle = ''' QToolButton:hover {border:1px solid #0078d7; background-color:#e5f1fb;} QToolButton:pressed {background-color:#a7c8e3} QToolButton {font-size:11pt; font-family:나눔고딕; border:1px solid #d6d7d8; background-color:#f0f1f1} ''' self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) self.setText(text) self.setStyleSheet(buttonStyle) def sizeHint(self): size = super(Button, self).sizeHint() size.setHeight(size.height() + 30) size.setWidth(max(size.width(), size.height())) return size if __name__ == '__main__': app = QtWidgets.QApplication([]) win=start() app.exec_()
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
The terminal process terminated with exit code: 5
쌤, pylint 설치를 누르면, The terminal process terminated with exit code: 5라고 뜨면서 설치가 되지 않습니다... 구글에 찾아봤는데 전부 영어고 생소한 분야의 영어라 잘 모르겠습니다.
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
복습 와중 질문
선생님 안녕하세요? 다름이 아니라 제가 복습을 하는 도중에 궁금한 점이 문득 떠올라서 질문 남겨 드립니다. 생성자를 이용해서 가족인적 사항을 만들어 보려고 하는데 조금 막히는 부분이 있어서요..ㅠㅠ 새로운 가족들이 나타나거나 제가 계속 이 프로그램 내부적으로 넣는것이 아니라 외부에서 넣을수 잇도록 하려고 하는데 이부분을 머리로는 어떻게 해볼까? 라는 생각은 나오는데 코드로 짜는게 안되서 한번 상의를 해보고자 질문을 올립니다 ㅠㅠ 제가 생각한 방법은 함수, 딕셔너리를 이용해서 name, age , job을 key로 사용하고 value값을 따로 저장한 다음에 넣는법 // 하지만 문제점은 클래스로 어떤식으로 넣어야 할지 막히네요..ㅠㅠ import os class Family: def __init__(self, **kwargs): self._name = "zz" self._age = 1 self._job = "developer" if "name" in kwargs: self._name = kwargs.get("name") if "age" in kwargs: self._age = kwargs.get("age") if "job" in kwargs: self._job = kwargs.get("job") def show(self): print(self._name) print(self._age) print(self._job) def clearDos(self): self._clears = input("do you want me to clear your dos?") if self._clears == 'y': os.system("cls") def ques(name, age, job): a = {name:"", age:"", job:""} for i range (len(a):
- 해결됨남박사의 파이썬 기초부터 실전 100% 활용
파일 읽고 쓰기에 대한 질문이 있습니다.
강의와 책을 같이 보면서 공부중입니다. 파일에 임의의 내용을 3줄로 써놓은 상태에서 한 줄씩 읽은 결과물에 대해서 의문이 생깁니다. # 파일의 내용을 한줄씩 읽기 with open('Hello.txt', mode='r') as file: line = None while line != '': line = file.readline() print(line.strip('\n')) # for 반복문을 이용하여 파일의 내용을 한줄씩 읽기 with open('Hello.txt', mode='r') as file: for line in file: print(line.strip('\n')) 위 내용을 실행해보면 위의 경우에는 3줄이 모두 출력된 다음에 공백이 한 줄 생기는데 아래의 경우에는 공백 없이 3줄을 출력후에 종료가 됩니다. 무슨 차이인지 잘 모르겠습니다. 위의 경우에 line 변수에 마지막줄이 출력된 다음에 그 다음줄로 넘어간다고 해도 while 조건에서 거짓이 되니까 line이 공백이더라도 출력이 안돼야 하는게 정상인거 같은데...아닌가요?
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
파일 배포하기에서 질문있습니다!
배포파일을 만들었는데 실행이안됩니다 라이브러리는 다 설치했는데 인코딩문제인지 구글링해보니 reload(sys) 등등 하라고 해서 메인함수에 추가해봐도 reload(sys)가 정의되지 않았다고 에러가뜨고 뭐가문제인지 잘 모르겠습니다 아래는 코드입니다 from PyQt5 import QtWidgets from PyQt5 import QtCore from PyQt5.QtWidgets import QToolButton, QSizePolicy import datetime import numpy as np import pandas as pd import matplotlib.pyplot as plt import cv2 import os class MainDialog(QtWidgets.QWidget): '''메인 윈도우가 되는 위젯. 이 창에서 나머지 기능들을 팝업시킵니다.''' def __init__(self): super().__init__() self.layout_s = QtWidgets.QVBoxLayout(self) #전체틀 self.start_layout = QtWidgets.QHBoxLayout() #버튼을 담을 틀 self.setFixedSize(300, 200) self.btn_watch = self.createButton("공부 시작",self.clickWatch)#버튼watch self.btn_graph = self.createButton("공부량 보기",self.clickGraph)#버튼graph self.btn_watch.resize(self.btn_watch.sizeHint())#sizeHint=holds the recommended size for the widget self.btn_graph.resize(self.btn_graph.sizeHint()) self.start_layout.addWidget(self.btn_watch)#틀에 버튼 담음 self.start_layout.addWidget(self.btn_graph) self.layout_s.addLayout(self.start_layout)#전체틀에 버튼을 담은 틀을 담음 self.setLayout(self.layout_s) self.show() def clickWatch(self): '''공부 시작이 눌리면 동작하는 함수''' # MyClock 객체가 생성되어 newWindow 변수에 저장 self.newWindow = MyClock() # 새로운 위젯 show self.newWindow.show() def clickGraph(self): try: image = cv2.imread("C:\\study\\chart.png", cv2.IMREAD_ANYCOLOR) cv2.imshow("study time", image) cv2.waitKey(0)#cv2.waitkey(time)이며 time마다 키 입력상태를 받아옵니다. #0일 경우, 지속적으로 검사하여 해당 구문을 넘어가지 않습니다. cv2.destroyAllWindows()#창 닫기 except: QtWidgets.QMessageBox.about(self, "알림", "공부하세요!") def createButton(self, text, function): button = Button(text) button.clicked.connect(function) return button class MyClock(QtWidgets.QWidget): def __init__(self): super().__init__() # 스톱와치 용 변수 self.createFolder("C:\\study") self.watch_start_time = 0 self.mouseClick = False self.setWindowTitle("시계") self.setFixedSize(250, 100)#사이즈고정 self.setWindowFlags(QtCore.Qt.FramelessWindowHint)#타이틀바 없앰 self.initWidgets() self.show() self.days = datetime.date.today().day self.months=datetime.date.today().month def createFolder(self,directory): try: if not os.path.exists(directory): os.makedirs(directory) except OSError: print("error") def keyPressEvent(self, e):#esc누르면 종료 if e.key() == QtCore.Qt.Key_Escape: day = str(self.months)+"/"+str(self.days) try:#이미 파일을 만들었으면 data = pd.read_csv('C:\\study\\graph.csv') if data.loc[len(data)-1, "day"]==day:#같은 날짜면 시간 누적 data.loc[data["day"]==day, "time"]+=self.watch_start_time data.to_csv('C:\\study\\graph.csv',header=True, index=False) else:#새로운 날짜,시간 append data2=pd.DataFrame({"day":[day],"time":[self.watch_start_time]}) data=pd.concat([data,data2], ignore_index=True) data.to_csv('C:\\study\\graph.csv',header=True, index=False) except:#파일이없으면 df=pd.DataFrame({"day":[day],"time":[self.watch_start_time]}) df.to_csv('C:\\study\\graph.csv',header=True, index=False)#header:column이름 정보 data=pd.read_csv('C:\\study\\graph.csv') group_by_day=data.groupby('day').time.sum()#day별로 time의 합을 구함 y=list(group_by_day) x = np.arange(len(y)) xlabel = list(data["day"]) plt.title("Amount",fontsize=20) plt.bar(x, y) plt.xticks(x, xlabel) plt.yticks(sorted(y)) plt.xlabel("Date",fontsize=10) plt.ylabel("Study Time(s)",fontsize=10) plt.savefig('C:\\study\\chart.png')#그래프 저장 self.close() def mousePressEvent(self, e):#마우스로 창 누를때 if e.button() == QtCore.Qt.LeftButton:#좌클릭시 self.mouseClick = True self.oldPos = e.globalPos()#x,y가 튜플형태로 넘어옴 #globalPos=윈도우상의 x,y좌표 def mouseReleaseEvent(self, e): self.mouseClick = False def mouseMoveEvent(self, e):#마우스로 창 누른뒤 이동시킬때 if self.mouseClick: delta = QtCore.QPoint(e.globalPos() - self.oldPos) self.move(self.x() + delta.x(), self.y() + delta.y()) self.oldPos = e.globalPos() def initWidgets(self): self.layout = QtWidgets.QVBoxLayout(self) #QV=가로 QH=세로 # 시작, 초기화 버튼 2개를 HBoxLayout 에 추가합니다. self.button_layout = QtWidgets.QHBoxLayout() # 버튼을 담기위한 레이아웃 self.btn_start = QtWidgets.QPushButton("중지", self) self.btn_reset = QtWidgets.QPushButton("초기화", self) self.btn_start.resize(self.btn_start.sizeHint()) self.btn_reset.resize(self.btn_start.sizeHint()) self.button_layout.addWidget(self.btn_start) self.button_layout.addWidget(self.btn_reset) self.lcd = QtWidgets.QLCDNumber()#시계디자인 위젯 self.lcd.setSegmentStyle(QtWidgets.QLCDNumber.Flat)#글자평평하게 self.lcd.setDigitCount(8)#글자 총 8개까지 보여줌(hh:mm:ss) self.lcd.setFrameStyle(QtWidgets.QFrame.NoFrame)#박스없앰 self.timer = QtCore.QTimer() # 타이머 생성 # 스탑와치용 출력 함수 연결 self.timer.timeout.connect(self.showWatch) # 타임아웃 이벤트를 showWatch와 연결 # 정한 시간이 지날때마다 show_time 실행 self.timer.start(1000)#1초에 한번씩 self.resetWatch() self.layout.addWidget(self.lcd) # 버튼 레이아웃을 기본 레이아웃에 추가합니다. self.layout.addLayout(self.button_layout) self.setLayout(self.layout) self.btn_start.clicked.connect(self.startWatch) self.btn_reset.clicked.connect(self.resetWatch) def startWatch(self): '''스탑와치를 시작하는 함수 입니다. 버튼 클릭시 시작과 중지를 한 버튼으로 처리하기 위해 버튼의 글자를 가져와서 각 상황에 맞게 동작합니다.''' text = self.btn_start.text() if text == "시작": self.btn_start.setText("중지") self.timer.start(1000) elif text == "중지": self.btn_start.setText("시작") self.timer.stop() def resetWatch(self): '''스탑와치를 초기화 합니다.''' text = "00:00:00" self.watch_start_time = 0 self.lcd.display(text) def showWatch(self): '''스탑와치의 현재시간 - 시작시간을 계산해서 화면에 출력하는 함수''' # 현재시간 - 스탑와치 시작시간을 total_seconds() 로 변환해서 초만 받습니다. self.watch_start_time+=1 # 진행된 초를 시:분:초로 출력하기 위해서 계산합니다. hour = self.watch_start_time // 3600 minute = self.watch_start_time % 3600 // 60 second = self.watch_start_time % 60 # 시:분:초 형태로 문자열 포맷팅을 합니다. text = '{:02d}:{:02d}:{:02d}'.format(hour, minute, second) # 출력 self.lcd.display(text) class Button(QToolButton): def __init__(self, text): super().__init__() buttonStyle = ''' QToolButton:hover {border:1px solid #0078d7; background-color:#e5f1fb;} QToolButton:pressed {background-color:#a7c8e3} QToolButton {font-size:11pt; font-family:나눔고딕; border:1px solid #d6d7d8; background-color:#f0f1f1} ''' self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) self.setText(text) self.setStyleSheet(buttonStyle) def sizeHint(self): size = super(Button, self).sizeHint() size.setHeight(size.height() + 30) size.setWidth(max(size.width(), size.height())) return size if __name__ == '__main__': app = QtWidgets.QApplication([]) win=MainDialog() app.exec_() freeze 결과입니다 (stopwatch) PS C:\python\스톱워치\dist> pip freeze altgraph==0.17 cycler==0.10.0 DateTime==4.3 future==0.18.2 kiwisolver==1.1.0 matplotlib==3.1.3 numpy==1.18.1 opencv-python==4.2.0.32 pandas==1.0.1 pefile==2019.4.18 PyInstaller==3.6 pyparsing==2.4.6 PyQt5==5.14.1 PyQt5-sip==12.7.1 python-dateutil==2.8.1 pytz==2019.3 pywin32-ctypes==0.2.0 six==1.14.0 zope.interface==4.7.1
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
선생님 라이브러리 관련 질문있습니다.
문득 든 생각인데. 잘 짜여진 라이브러리를 자유롭게 들고와서 사용하는 강점인 파이썬인데 이것을 내 입맛에 맞게 커스터마이징 또한 가능할것이라고 생각을 하고 있는데 혹시 라이브러리의 단점이 있을까요?
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
path.rfind 관련 질문 입니다.
>>> path = "c:\\test\\abcd\\abcde.jpg" 여기서 "\\"는 총 3개가 들어 있는데요. >>> path.rfind("\\") 강의동영상에서 위와 같이 했을때 12가 나오는 원리가 잘 이해가 안됩니다.
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
# 파이썬 실전프로그래밍 1. 숫자맞추기 게임 질문 드립니다.
안녕하세요. 남박사님 다름이 아니라 숫자 맞추기 게임에 문의드립니다. 하단에 user_input = casting(input ("몇 일까요?")) 쓰셨는데 매개변수 msq를 바로 user_input = casting(input ("msq")) 안 쓰신 이유라도 있으신지 궁금합니다. *실행은 결과는 똑같지만 혹시 어떤 실무적인 부분에서 어떤 차이가 있는지 궁금합니다. 또 한 1.user_input = casting(input ("몇 일까요?")) 2.user_input = casting(input ("msq")) 두가지 중 어떠한 많이 쓰이는 방법이 어떤건지 궁금합니다. 아래 하단에 전체적인 코드를 삽입하였습니다. 감사합니다. def input_check(msq, casting= int): while True: try: user_input = casting(input("몇 일까요?")) # Input은 항상 str로 받음. return user_input except: continue # 숫자 맞추기 게임 import random import os ## dos 화면까지 화면을 깨끗히 제일 상단에 오게 바꿔줌. def input_check(msq, casting= int): while True: try: user_input = casting(input(msq)) # Input은 항상 str로 받음. return user_input except: continue chacne = 10 count = 0 number = random.randint(1,99) os.system("cls") # dos 화면까지 화면을 깨끗히 제일 상단에 오게 바꿔줌. print("1부터 99까지의 숫자를 10번 안에 맞춰 보세요.") while count < chacne: count += 1 user_input = input_check("몇 일까요? ") if number == user_input: break elif user_input < number: print("{}보다 큰 숫자 입니다.".format(user_input)) print("{}".format(" " * 60)) print("{}".format("*" * 60)) print("{}번의 기회를 남았습니다..".format(10-count)) print("{}".format("*" * 60)) print("{}".format(" " * 60)) elif user_input > number: print("{}보다 작은 숫자 입니다.".format(user_input)) print("{}".format(" " * 60)) print("{}".format("*" * 60)) print("{}번의 기회가 남았습니다.".format(10-count)) print("{}".format("*" * 60)) print("{}".format(" " * 60)) if user_input == number: print("성공! {}이 맞습니다.".format(number)) else: print("실패, 정답은 {} 입니다.",number)
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
디지털시계 만들기에서 질문있습니다!
수업내용이아니라 제가 스스로만드는 것에서 질문을 해도 될지 모르겠습니다 ^^; 배운것을 토대로 공부한 시간을 날짜별로 저장해서 그래프로 보여주는 프로그램을 만들고있는데, 맨 첫 창을 "공부시작", "공부량보기"(그래프) 로 설정하고 공부시작을 누르면 타이머가 작동하도록 하고싶은데 타이머창이 열리지않고 아무창도 안떠서 질문드립니다.. 제 계획은 맨 첫창이 뜬 뒤 "공부시작"을 누르면 맨첫창은 그대로 있고 타이머만 새로운 창으로 열려서 동작하게 할 생각인데, 그러면 def __init__(self)를 아예 수정하고 다른 함수에서 원래있던 def __init__(self)의 설정들을 저장해줘야할것 같은데 어떻게 코드를 짜야할지 감이 안잡힙니다 ㅠ 그리고 https://doc.qt.io/qt-5/qwidget.html 에서 버튼 클릭시 새로운 창이 뜨게하는 함수를 찾으려해도 양이 너무 방대해서 어떻게 원하는 함수를 딱 찾을수 있는지도 모르겠습니다 조금만 알려주시면 정말 감사하겠습니다 from PyQt5 import QtWidgets from PyQt5 import QtCore import datetime,time import numpy as np import seaborn as sns import pandas as pd import matplotlib.pyplot as plt class MyClock(QtWidgets.QWidget): def __init__(self): super().__init__() # 스톱와치 용 변수 self.watch_start_time = 0 self.mouseClick = False self.setWindowTitle("시계") self.setFixedSize(250, 100)#사이즈고정 self.setWindowFlags(QtCore.Qt.FramelessWindowHint)#타이틀바 없앰 self.startMenu() self.show() self.days = datetime.date.today().day self.months=datetime.date.today().month def keyPressEvent(self, e):#esc누르면 종료 if e.key() == QtCore.Qt.Key_Escape: day = str(self.months)+"/"+str(self.days) try:#이미 파일을 만들었으면 data = pd.read_csv('C:\\python\\graph.csv') if data.loc[len(data)-1, "day"]==day:#같은 날짜면 시간 누적 data.loc[data["day"]==day, "time"]+=self.watch_start_time data.to_csv('graph.csv',header=True, index=False) else:#새로운 날짜,시간 append data2=pd.DataFrame({"day":[day],"time":[self.watch_start_time]}) pd.merge(data,data2) data.to_csv('graph.csv',header=True, index=False) except:#파일이없으면 df=pd.DataFrame({"day":[day],"time":[self.watch_start_time]}) df.to_csv('graph.csv',header=True, index=False)#header:column이름 정보 self.close() def mousePressEvent(self, e):#마우스로 창 누를때 if e.button() == QtCore.Qt.LeftButton:#좌클릭시 self.mouseClick = True self.oldPos = e.globalPos()#x,y가 튜플형태로 넘어옴 #globalPos=윈도우상의 x,y좌표 def mouseReleaseEvent(self, e): self.mouseClick = False def mouseMoveEvent(self, e):#마우스로 창 누른뒤 이동시킬때 if self.mouseClick: delta = QtCore.QPoint(e.globalPos() - self.oldPos) self.move(self.x() + delta.x(), self.y() + delta.y()) self.oldPos = e.globalPos() def watch(self): self.initWidgets() def graph(self): pass def startMenu(self): self.layout_s = QtWidgets.QVBoxLayout(self) #전체틀 self.start_layout = QtWidgets.QHBoxLayout() #버튼을 담을 틀 self.btn_watch = QtWidgets.QPushButton("공부 시작",self)#버튼watch self.btn_graph = QtWidgets.QPushButton("공부량 보기",self)#버튼graph self.btn_watch.resize(self.btn_watch.sizeHint())#sizeHint=holds the recommended size for the widget self.btn_graph.resize(self.btn_graph.sizeHint()) self.start_layout.addWidget(self.btn_watch)#틀에 버튼 담음 self.start_layout.addWidget(self.btn_graph) self.layout_s.addLayout(self.start_layout)#전체틀에 버튼을 담은 틀을 담음 self.setLayout(self.layout_s) self.btn_watch.clicked.connect(self.initWidgets)#버튼 클릭시 함수와 연결 self.btn_graph.clicked.connect(self.graph) def initWidgets(self): self.layout = QtWidgets.QVBoxLayout(self) #QV=가로 QH=세로 # 시작, 초기화 버튼 2개를 HBoxLayout 에 추가합니다. self.button_layout = QtWidgets.QHBoxLayout() # 버튼을 담기위한 레이아웃 self.btn_start = QtWidgets.QPushButton("중지", self) self.btn_reset = QtWidgets.QPushButton("초기화", self) self.btn_start.resize(self.btn_start.sizeHint()) self.btn_reset.resize(self.btn_start.sizeHint()) self.button_layout.addWidget(self.btn_start) self.button_layout.addWidget(self.btn_reset) self.lcd = QtWidgets.QLCDNumber()#시계디자인 위젯 self.lcd.setSegmentStyle(QtWidgets.QLCDNumber.Flat)#글자평평하게 self.lcd.setDigitCount(8)#글자 총 8개까지 보여줌(hh:mm:ss) self.lcd.setFrameStyle(QtWidgets.QFrame.NoFrame)#박스없앰 self.timer = QtCore.QTimer() # 타이머 생성 # 스탑와치용 출력 함수 연결 self.timer.timeout.connect(self.showWatch) # 타임아웃 이벤트를 showWatch와 연결 # 정한 시간이 지날때마다 show_time 실행 self.timer.start(1000)#1초에 한번씩 self.resetWatch() self.layout.addWidget(self.lcd) # 버튼 레이아웃을 기본 레이아웃에 추가합니다. self.layout.addLayout(self.button_layout) self.setLayout(self.layout) self.btn_start.clicked.connect(self.startWatch) self.btn_reset.clicked.connect(self.resetWatch) def startWatch(self): '''스탑와치를 시작하는 함수 입니다. 버튼 클릭시 시작과 중지를 한 버튼으로 처리하기 위해 버튼의 글자를 가져와서 각 상황에 맞게 동작합니다.''' text = self.btn_start.text() if text == "시작": self.btn_start.setText("중지") self.timer.start(1000) elif text == "중지": self.btn_start.setText("시작") self.timer.stop() def resetWatch(self): '''스탑와치를 초기화 합니다.''' text = "00:00:00" self.watch_start_time = 0 self.lcd.display(text) def showWatch(self): '''스탑와치의 현재시간 - 시작시간을 계산해서 화면에 출력하는 함수''' # 현재시간 - 스탑와치 시작시간을 total_seconds() 로 변환해서 초만 받습니다. self.watch_start_time+=1 # 진행된 초를 시:분:초로 출력하기 위해서 계산합니다. hour = self.watch_start_time // 3600 minute = self.watch_start_time % 3600 // 60 second = self.watch_start_time % 60 # 시:분:초 형태로 문자열 포맷팅을 합니다. text = '{:02d}:{:02d}:{:02d}'.format(hour, minute, second) # 출력 self.lcd.display(text) app = QtWidgets.QApplication([]) win = MyClock() app.exec_()
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
수정된 직방 크롤링 코드 관련 질문있습니다.
안녕하세요. 조용히 강의만 듣다가 처음으로 질문을 남겨봅니다. 매번 얻어가는 내용이 많아서 언제나 감사한 마음 뿐입니다. 다른 분이 관련해서 질문을 남기셔서, Geohash 사용된 수정해주신 코드는 잘봤습니다.(https://www.inflearn.com/questions/22997) 코드에서 궁금한 점이 생겨 질문 남깁니다. 수업에서 말씀해주신 것처럼,웹사이트 구조라는게 워낙 경우가 다양해서, 코드 짜는것 이상으로 웹사이트 분석해보는 일도 나름 열심히 연습해보고있는데요,작성해주신 코드에서, # 위에서 구한 geohash 값을 아래의 api 로 호출하고 쿼리(전세 월세 등)를 넘겨주는 주소 입니다. url = "https://apis.zigbang.com/v2/items?deposit_gteq=0&domain=zigbang&geohash={}&rent_gteq=0&sales_type_in=전세%7C월세&service_type_eq=원룸".format(geohash) 위 주소를 구하려면 직방의 어디서 어떤 식으로 접근해야 하는지 궁금합니다.직방에서 크롬 개발자모드 열고 여기저기 찾아봤는데도 제 수준에선 알아내는게 어렵네요. 결국 사이트 작동구조를 파악하려면 사이트 소스들을 보고 추론해야 하는 수밖에 없는 듯 한데작성해주신 코드를 보고 있자면 이런 작동방식을 어떻게 알아내셨는지 정말 감탄만 나오는 한편,아직 갈 길이 멀게만 느껴지기도 하네요. 사이트 분석에 요령같은 게 있는지도 궁금합니다. 답변 부탁드려요.
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
선생님 너무 감사합니다.
안녕하세요! 열심히 학습하고 다시 또 돌아와서 다시 또 복습하는 수강생입니다. 다름이 아니라 제가 현실적인 문제에 봉착해서 간단한 질문을 좀 드리려고 왔습니다. 전공자는 아니지만 개발자가 꿈인 사람으로서 노력을 하고 있으며 간단한 프로그램은 개발이 가능한데 점점 더 어려워지기 시작하면서 학습에 대해 멘붕?이 왔네요.. 보통 통상적으로 초급에서 중급으로 넘어갈때에 학습하기 좋은 방법이 있을까요? 또 점점 더 기초적인 부분이 다시 헷갈리기 시작해서 매번 기초부분만 도돌이표 하듯 복습하는데.. 실질적인 실력을 늘릴수 있는 제가 생각한 프로그램을 짜기위한 방법이 뭐가 있을까 싶어서 질문 올립니다..
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
디지털시계 만들기에서 질문있습니다!
제가 공부시간측정하는 프로그램을 만들려고 하는데, 현재 시간말고 00:00:00부터 시작하도록 하고싶습니다. 갖은방법을 써보았으나 QtCore.QTime.currentTime()를 쓰지않고 빼기연산으로 시간을 측정시 연산시간떄문에 부정확하여 구글링을 해보니 아예 다른코드뿐이라 이해가 되지않아 질문드립니다 from PyQt5 import QtWidgets from PyQt5 import QtCore class MyClock(QtWidgets.QWidget): def __init__(self): super().__init__() self.mouseClick = False self.setWindowTitle("시계") self.initWidgets() self.setFixedSize(250, 100)#사이즈고정 self.setWindowFlags(QtCore.Qt.FramelessWindowHint)#타이틀바 없앰 self.show() def keyPressEvent(self, e):#esc누르면 종료 if e.key() == QtCore.Qt.Key_Escape: self.close() def mousePressEvent(self, e):#마우스로 창 누를때 if e.button() == QtCore.Qt.LeftButton:#좌클릭시 self.mouseClick = True self.oldPos = e.globalPos()#x,y가 튜플형태로 넘어옴 #globalPos=윈도우상의 x,y좌표 def mouseReleaseEvent(self, e): self.mouseClick = False def mouseMoveEvent(self, e):#마우스로 창 누른뒤 이동시킬때 if self.mouseClick: delta = QtCore.QPoint(e.globalPos() - self.oldPos) self.move(self.x() + delta.x(), self.y() + delta.y()) self.oldPos = e.globalPos() def initWidgets(self): self.layout = QtWidgets.QVBoxLayout()#QV=가로 QH=세로 self.lcd = QtWidgets.QLCDNumber()#시계디자인 위젯 self.lcd.setSegmentStyle(QtWidgets.QLCDNumber.Flat)#글자평평하게 self.lcd.setDigitCount(8)#글자 총 8개까지 보여줌(hh:mm:ss) self.lcd.setFrameStyle(QtWidgets.QFrame.NoFrame)#박스없앰 self.timer = QtCore.QTimer()#타이머 생성 self.timer.timeout.connect(self.show_time)#타임아웃 이벤트를 show_time과 연결 #정한 시간이 지날때마다 show_time 실행 self.timer.start(1000)#1초에 한번씩 self.show_time() self.layout.addWidget(self.lcd) self.setLayout(self.layout) def show_time(self): time = QtCore.QTime.currentTime()#현재시간 self.currentTime = time.toString("hh:mm:ss")#모양을 만듬 self.lcd.display(self.currentTime) app = QtWidgets.QApplication([]) win = MyClock() app.exec_() app.exec_()
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
귀찮은 당신을 위해서
CHO = ["ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"] JUNG = ["ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ"] JONG = ["", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"]
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
맥 파이썬
맥은 어떤 버전을 받아야되나요?
- 미해결남박사의 파이썬 기초부터 실전 100% 활용
질문 있습니다!
초반에 2분11초에 for word in words_dict 루프문으로 딕셔너리 키 값만 가져온다고 하셨는데 혹시 왜 키 값만 가져오는건지 제가 알수있을까요?