728x90
반응형
SMALL

bgm.wav
5.62MB
gunsound.mp3
0.04MB

from tkinter import *
import pygame

class GameSound:
	def __init__(self):
		window = Tk() # 윈도우 생성
		window.title("게임사운드") # 제목을 설정
		window.geometry("640x480") # 윈도우 크기 설정
		window.resizable(0,0)        
		
		
		self.canvas = Canvas(window, bg = "white")
		self.canvas.pack(expand=True,fill=BOTH)
		window.bind("<KeyPress>",self.keyPressHandler)
		window.bind("<KeyRelease>",self.keyReleaseHandler)

		#pygame 에서 music vs sound
		# music: 배경음악 재생을 위해 사용
		# sound: 효과음을 위해 사용

        #BG sound.
		pygame.init()
		pygame.mixer.music.load("bgm.wav") #Loading File Into Mixer
		pygame.mixer.music.play(-1) #Playing It In The Whole Device
		self.canvas.create_text(320,400,font="Times 15 italic bold",text="Sound Example")

		#Effect sound
		self.sounds = pygame.mixer
		self.sounds.init()
		self.s_effect1 = self.sounds.Sound("gunsound.mp3")
				
		while True:
			#
			window.after(33)
			window.update()

	def keyReleaseHandler(self, event):
		if event.keycode in self.keys:
		    self.keys.remove(event.keycode)

	def keyPressHandler(self, event):		
		self.s_effect1.play()
		self.keys.add(event.keycode)

GameSound()

 

코드 설명

  • pygame 모듈을 사용하기 위해 pygame을 import 한다.(line 2)
  • pygame을 사용하기 위해서는 pygame.init()함수를 호출해야한다.(line 21)
  • 위 코드에서 music.load(), music.play() 함수를 이용하여 배경음악을 무한반복 재생한다.(line 22, 23)
  • effect sound를 위해 sounds 를 초기화 한다.(line 28)
  • 이펙트 사운드 'gunsound.mp3'  파일을 읽고 sound 객체를 반환한다. sound 객체는 이펙트 사운드는 게임중 재생 및 멈춤을 컨트롤할 수 있다.
  • line 41에서 이펙트 사운드를 재생한다.

위 코드만으로 간단히 게임에서 필요한 음악 재생은 가능하며 좀 더 다양한 기능을 구현하기 위해서는 아래의 링크를 참조하기 바랍니다.

 

 

https://www.pygame.org/docs/ref/music.html

 

pygame.mixer.music — pygame v2.6.0 documentation

Resets playback of the current music to the beginning. If pause() has previously been used to pause the music, the music will remain paused. Note rewind() supports a limited number of file types and notably WAV files are NOT supported. For unsupported file

www.pygame.org

 

https://www.pygame.org/docs/ref/mixer.html

 

pygame.mixer — pygame v2.6.0 documentation

begin sound playback play(loops=0, maxtime=0, fade_ms=0) -> Channel Begin playback of the Sound (i.e., on the computer's speakers) on an available Channel. This will forcibly select a Channel, so playback may cut off a currently playing sound if necessary.

www.pygame.org

 

728x90
반응형
LIST
728x90
반응형
SMALL

아래의 음성 인식과 오디오 패키지를 설치한다.

 

pip install SpeechRecognition

pip install pyaudio

 

설치된 패키지를 활용한 파이썬 코드는 아래와 같다

import speech_recognition as sr

r = sr.Recognizer()
	
with sr.Microphone() as source:
    r.adjust_for_ambient_noise(source, duration=0.2)
    while True:
        try:
            print('listen...')

            #listens for the user's input
            user_audio = r.listen(source)

            # Using google to recognize audio
            #text = r.recognize_google(user_audio) # 영어
            text = r.recognize_google(user_audio, language='ko-KR') # 한글

            print("Did you say: ",text)

        except sr.RequestError as e:
            print("Could not request results; {0}".format(e))

        except sr.UnknownValueError:
            print("unknown error occurred")

 

음성인식 패키지는 모두 아래와 같이 13개의 음성인식 엔진 또는 API을 지원하고 4개가 오프라인으로 동작이 가능하다.

 

Speech recognition engine/API support:

 

추가로 오프라인 음성인식중 CMU Sphinx 를 사용해보자

pip install PocketSphinx

를 추가로 설치해야됨

 

그리고 위 코드에서 인식 부분을 r.recognize_sphinx(audio) 로 수정하면 완료된다.

(참고로 한국어 인식은 지원X)

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

대용량 파일을 읽기 위해서는 다양한 방법들이 있는데, 그중에서 메모리 매핑을 통하여 빠르게 접급하는 방법에 대해서 알아 보자.

 

먼저 예제 코드는 아래와 같다.

import mmap

def process(data):
	# 데이터 처리 로직
    pass

with open('large_file.txt', 'r+b') as f:
    mm = mmap.mmap(f.fileno(), 0)
    while True:
        line = mm.readline()
        if not line:
            break
        # 각 줄에 대한 처리
        process(line)
    mm.close()

 

첫줄에 mmap 를 사용할 것이라고 선언(import) 을 하는데 mmap 는 메모리 매핑(memory mapping)을 수행하는 모듈입니다. 장점은 메모리에 매핑된 데이터를 디스크에서 직접 읽어오기 때문에 디스크에서 메모리로 데이터 복사가 없습니다. 그러므로 대용량 처리를 가능하게 합니다.

 

그리고 open() 함수를 이용하여 파일 열기를 수행합니다.

 

다음으로 mmap()와 fileno() 함수를 이용하는데 이는 파일이 가지고 있는 식별자 즉 id(또는 파일 디스크립터)를 메모리에 연결시킵니다.

** 디스크립터(식별자 또는 id)는 파일이 열 때 운영체제로 부터 자동으로 할당되어짐

 

이제 디스크에 저장된 파일과 메모리 연결이 완료되었으니 readline()을 이용하여 한줄씩 접근하고 처리합니다.

 

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

프로세스 (Process)

  • 프로세스는 독립적으로 실행되는 프로그램의 인스턴스입니다. 각 프로세스는 별도의 메모리 공간과 리소스를 가진다.
  • 장점:
    • GIL의 영향을 받지 않아, 진정한 병렬 처리가 가능합니다.( GIL은 Global Interpreter Lock의 약어로, 여러 개의 스레드가 파이썬 바이트코드를 한번에 하나만 사용할 수 있게 락을 거는 것을 의미한다, 바이트 코드(Byte code)는 고급 언어로 작성된 소스 코드를 가상머신 이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다.)
    • 프로세스 간의 격리로 인해 하나의 프로세스에서 발생한 오류가 다른 프로세스에 영향을 주지 않습니다.(상호독립적으로 구성)
  • 단점:
    • 프로세스 간 통신(IPC, Inter-Process Communication)이 상대적으로 복잡하고 느립니다.
    • 메모리 사용량이 더 많습니다.

스레드 (Thread)

  • 정의: 스레드는 동일한 프로세스 내에서 실행되는 가벼운 단위입니다. 스레드들은 같은 메모리 공간을 공유합니다.
  • 장점:
    • 메모리 공유로 인한 효율적인 자원 사용.
    • 스레드 간 통신이 빠르고 간단합니다.
  • 단점:
    • GIL(Global Interpreter Lock)로 인해, 진정한 병렬 처리가 어렵습니다. (특히 CPU 바운드 작업에서)
    • 하나의 스레드에서 발생한 오류가 전체 프로세스에 영향을 줄 수 있습니다.

 

멀티스레딩 예지

import threading
import time

def print_numbers():
    for i in range(1, 6):
        print(f"Number: {i}")
        time.sleep(1)

def print_letters():
    for letter in ['A', 'B', 'C', 'D', 'E']:
        print(f"Letter: {letter}")
        time.sleep(1.5)

thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

thread1.start()
thread2.start()

thread1.join()
thread2.join()

print("All threads are done!")

 

멀티프로세싱 예제

import multiprocessing
import time

def print_numbers():
    for i in range(1, 6):
        print(f"Number: {i}")
        time.sleep(1)

def print_letters():
    for letter in ['A', 'B', 'C', 'D', 'E']:
        print(f"Letter: {letter}")
        time.sleep(1.5)

process1 = multiprocessing.Process(target=print_numbers)
process2 = multiprocessing.Process(target=print_letters)

process1.start()
process2.start()

process1.join()
process2.join()

print("All processes are done!")

주요 차이점 요약

  • 메모리 공유: 스레드는 같은 메모리를 공유하지만, 프로세스는 별도의 메모리를 사용합니다.
  • GIL의 영향: 스레드는 GIL의 영향을 받으며, CPU 바운드 작업에서 성능이 제한될 수 있습니다. 반면, 프로세스는 GIL의 영향을 받지 않습니다.
  • 안정성: 프로세스는 서로 격리되어 있어 하나의 프로세스 오류가 다른 프로세스에 영향을 주지 않습니다.
  • 통신 방법: 스레드는 간단하고 빠른 통신이 가능하지만, 프로세스는 복잡하고 느린 통신을 사용합니다.

적절한 방법을 선택하는 것은 작업의 특성에 따라 다르며, I/O 바운드 작업에는 스레드를, CPU 바운드 작업에는 프로세스를 사용하는 것이 일반적입니다.

 

I/O 바운드: 입출력 작업이 많은 프로세스

CPU 바운드: 입출력 작업보다 연산작업이 많은 프로세스

728x90
반응형
LIST
728x90
반응형
SMALL

파이썬에서 스레드를 사용하는 방법은 주로 `threading` 모듈을 통해 이루어집니다. 

이 모듈은 병렬 처리를 통해 여러 작업을 동시에 수행할 수 있도록 도와줍니다. 

 

스레드 예제

import threading
import time

# 스레드에서 실행할 함수 정의
def print_numbers():
    for i in range(1, 6):
        print(f"Number: {i}")
        time.sleep(1)

def print_letters():
    for letter in ['A', 'B', 'C', 'D', 'E']:
        print(f"Letter: {letter}")
        time.sleep(1.5)

# 스레드 생성
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

# 스레드 시작
thread1.start()
thread2.start()

# 메인 스레드가 thread1, thread2가 종료될 때까지 대기
thread1.join()
thread2.join()

print("All threads are done!")



### 코드 설명
1. `print_numbers`와 `print_letters`라는 두 개의 함수를 정의합니다. 각 함수는 숫자와 문자를 순차적으로 출력하며, 각 출력 사이에 `time.sleep`을 통해 지연 시간을 둡니다.
2. `threading.Thread` 클래스를 사용하여 두 개의 스레드를 생성합니다. 각각의 스레드는 실행할 함수를 `target` 인자로 받습니다.
3. `start()` 메서드를 호출하여 스레드를 시작합니다. 이 메서드를 호출하면 스레드가 백그라운드에서 실행되기 시작합니다.
4. `join()` 메서드를 사용하여 메인 스레드가 각 스레드의 실행이 완료될 때까지 기다리도록 합니다. 이 메서드를 호출하지 않으면 메인 스레드는 스레드의 실행이 완료되기 전에 종료될 수 있습니다.
5. 모든 스레드가 완료되면 "All threads are done!"이라는 메시지를 출력합니다.

이 예제는 두 개의 스레드를 생성하고 실행하며, 각각의 스레드가 독립적으로 동작하면서 동시에 숫자와 문자를 출력합니다. `join()` 메서드를 통해 메인 스레드가 두 스레드의 종료를 기다리므로, 모든 작업이 완료된 후에 "All threads are done!" 메시지가 출력됩니다.

728x90
반응형
LIST
728x90
반응형
SMALL

tkinter 를 이용한 마우스 이벤트는

window에 bind 함수를 이용하여 마우스 이벤트를 각각 연결시킨다.

 

이때 bind() 함수는 다음과 같이 두 개의 이자를 가져야 한다.

 - bind("이벤트명",연결함수) #이벤트 연결을 위한 가장 중요한 함수!!!!!

 

이벤트 종류는 다음과 같다.

<Button-1> : 마우스 왼쪽 버튼 클릭
<Button-2> : 마우스 중간 버튼 클릭
<Button-3> : 마우스 오른쪽 버튼 클릭
<Button-4> : 마우스 휠을 스크롤바에서 위로 올릴 때(scroll up event)
<Button-5> : 마우스 휠을 스크롤바에서 아래로 내릴 때(scroll down event)
<ButtonPress> : 아무 마우스 버튼이라도 눌리면 호출 된다. 휠까지도
<Double-Button-1> : 마우스 왼쪽 버튼 더블 클릭
<Double-Button-2> : 마우스 중간 버튼 더블 클릭
<Double-Button-3> : 마우스 오른쪽 버튼 더블 클릭
<Return> : 엔터가 눌러짐
<Key> : 키가 눌러짐
<Enter> : 마우스 포인터가 위젯에 들어올 때
<Leave> : 마우스 포인터가 위젯을 떠날때
<Configure> : 위젯 사이즈에 변화가 있을때

 

이중에서 마우스와 관련 된 이벤트를 적용한 코드 예제는 아래와 같다.

from tkinter import *

class MouseEvent:
    def __init__(self):
        window = Tk()
        window.title("마우스 이벤트")
        window.geometry("640x480")
        
        self.canvas=Canvas(window, bg ="white")
        self.canvas.pack(expand=True, fill=BOTH)
        window.bind("<Button-1>",self.MouseClickEvent)
        window.bind('<Double-1>', self.MouseDoubleClickEvent)
        window.bind('<B1-Motion>', self.MouseMotionEvent) 

        self.mousestr = "Mouse: "
        self.mouse_id = self.canvas.create_text(320,240,font="Times 15 italic bold",text=self.mousestr)    
        self.canvas.create_text(320,360,font="Times 15 italic bold",text="Mouse Event Example")
        
        while True:
            #
            self.canvas.itemconfigure(self.mouse_id, text=self.mousestr)
            #
            window.after(33)
            window.update()

    def MouseClickEvent(self, event):
        self.mousestr = "Mouse: " + str(event.x) + ", " + str(event.y) + "에서 마우스 클릭 이벤트 발생"
        

    def MouseDoubleClickEvent(self, event):
        self.mousestr = "Mouse: " + str(event.x) + ", " + str(event.y) + "에서 마우스 더블 클릭 이벤트 발생"

    def MouseMotionEvent(self, event):
        self.mousestr = "Mouse: " + str(event.x) + ", " + str(event.y) + "에서 마우스 모션 이벤트 발생"


MouseEvent()
728x90
반응형
LIST
728x90
반응형
SMALL

정렬시 key  를 사용하여 원하는 기준으로 정렬할 수 있음

 

1) 절대값으로 정렬

a = [-2, -5, 3, 1, -10]

a.sort(key=abs)
print(a)
a = [-2, -5, 3, 1, -10]

b = sorted(a, key=abs)
print(b)

 - 실행결과

[1, -2, 3, -5, -10]

 

2) lambda 를 사용하여 정렬

a = [-2, -5, 3, 1, -10]

a.sort(key=lambda x: -(x*2))
print(a)
a = [-2, -5, 3, 1, -10]

b = sorted(a,key=lambda x: -(x*2))
print(b)

 

각 값들이 -(x*2) 가 적용되어 [4, 10, -6, -2, 20] 로 되고 다시 오름차순으로 정렬되어 아래와 같이 실행결과가 나타남

 

- 실행결과

[3, 1, -2, -5, -10]

 

3) 사용자 정의 객체 리스트를 속성에 따라 정렬하기

 

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

people = [Person("Alice", 25), Person("Bob", 30), Person("Charlie", 20)]
sorted_people = sorted(people, key=lambda x: x.age)
print([person.name for person in sorted_people])

 

key 매개변수에 lambda 함수를 사용하여 각 요소를 어떻게 비교할지를 정의

 

- 실행결과

['Charlie', 'Alice', 'Bob']

728x90
반응형
LIST

'IT > 파이썬 문법' 카테고리의 다른 글

파이썬 sort, sorted 함수 차이  (0) 2024.05.08
파이썬 zip 함수 사용하기  (0) 2024.05.08
파이썬 map 함수  (0) 2024.05.08
파이썬 enumerate 함수  (0) 2024.05.04
변수  (0) 2022.03.26
728x90
반응형
SMALL

*** 두 함수 모두 기본으로 오름차순 정렬됨

***  sort(): 자기자신을 정렬, 리스트 함수

***  sorted() 자기자신이 정렬된 결과를 리스트형식으로 반환함(자기자신은 정렬이 안됨, 아래 예제확인), 파이썬 내장함수

 

1) sort, sorted 비교 예제 코드

a = [4,2,5,1,3]

a.sort()

print(a)

- 실행결과

[1, 2, 3, 4, 5]

 

a = [4,2,5,1,3]

b = sorted(a)

print('a=',a)
print('b=',b)

- 실행결과

a= [4, 2, 5, 1, 3]
b= [1, 2, 3, 4, 5]

 

2) 내림차순 정렬

a = [4,2,5,1,3]

b = sorted(a,reverse=True)
a.sort(reverse=True)

print('a= ', a)
print('b= ', b)

- 실행 결과

a=  [5, 4, 3, 2, 1]
b=  [5, 4, 3, 2, 1]

728x90
반응형
LIST

'IT > 파이썬 문법' 카테고리의 다른 글

파이썬 sort, sorted 함수에 key, lambda 사용  (0) 2024.05.08
파이썬 zip 함수 사용하기  (0) 2024.05.08
파이썬 map 함수  (0) 2024.05.08
파이썬 enumerate 함수  (0) 2024.05.04
변수  (0) 2022.03.26
728x90
반응형
SMALL

zip 함수는 두개의 리스트를 묶을 때 주로 사용합니다.

 

예제코드

1) 기본예제

a = [1,2,3,4]
b = [a,b,c,d]

result = list(zip(a,b))

print(result)

 

- 실행결과

[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]

 

2) for 문 사용하기

a = [1,2,3,4]
b = ['a','b','c','d']

for i, j in zip(a,b):
    print(i,j)

- 실행결과

1 a
2 b
3 c
4 d

 

3) 딕셔너리 만들기

a = ['a','b','c','d']
b = [1,2,3,4]

d = dict(zip(a,b))
print(d)
print(d['a'],d['b'],d['c'],d['d'])

- 실행결과

{'a': 1, 'b': 2, 'c': 3, 'd': 4}
1 2 3 4

 

728x90
반응형
LIST

'IT > 파이썬 문법' 카테고리의 다른 글

파이썬 sort, sorted 함수에 key, lambda 사용  (0) 2024.05.08
파이썬 sort, sorted 함수 차이  (0) 2024.05.08
파이썬 map 함수  (0) 2024.05.08
파이썬 enumerate 함수  (0) 2024.05.04
변수  (0) 2022.03.26
728x90
반응형
SMALL

map 함수는 리스트의 각 요소에 특정 함수를 적용할 때 사용함

 

사용예제

(1) 실수 -> 정수 변환

a = [1.1, 2.2, 3.3 ,4.4]

b = list(map(int, a))

print(b)

 - 실행결과

[1, 2, 3, 4]

 

(2)  정수 문자 변환

a = [1, 2, 3 ,4]

b = list(map(str, a))

print(b)

 - 실행결과

['1', '2', '3', '4']

 

(3)  lambda 적용하기 

a = [1, 2, 3 ,4]

b = list(map(lambda x: x+1, a))

print(b)

 - 실행결과

[2, 3, 4, 5]

728x90
반응형
LIST

'IT > 파이썬 문법' 카테고리의 다른 글

파이썬 sort, sorted 함수에 key, lambda 사용  (0) 2024.05.08
파이썬 sort, sorted 함수 차이  (0) 2024.05.08
파이썬 zip 함수 사용하기  (0) 2024.05.08
파이썬 enumerate 함수  (0) 2024.05.04
변수  (0) 2022.03.26

+ Recent posts