업무 자동화/python & CAD

Python 기초 학습] 입력된 text 출력하기 #2

ToolBOX01 2025. 8. 20. 08:44
반응형

▣ 입력된 내용을 연산하여 표시 하기

이 프로그램은 "Stock Calculator"라는 이름의 간단한 주식 계산 도구로, 다음과 같은 기능을 제공합니다:

  1. 입력 항목:
    • 주식 종목: 사용자가 주식의 이름을 문자열로 입력할 수 있는 필드입니다(예: "삼성전자").
    • 주 가: 주식의 가격을 정수로 입력하는 필드입니다(예: "1000").
    • 수 량: 주식의 매수 또는 매도 수량을 정수로 입력하는 필드입니다(예: "5").
  2. 비용 계산 기능:
    • "비용 계산" 버튼을 클릭하면, 입력된 주 가와 수량을 곱하여 총 비용을 계산합니다.
    • 계산 결과는 "주식 종목: 총액 원" 형식으로 표시되며, 총액은 1000 단위마다 쉼표가 포함됩니다(예: "삼성전자: 5,000 원").
    • 결과는 버튼 아래에 별도의 레이블에 표시됩니다.
  3. 입력 검증:
    • 모든 입력 필드가 비어 있지 않은지 확인하며, 비어 있을 경우 적절한 오류 메시지("주식 종목을 입력하세요" 또는 "주 가와 수량을 입력하세요")를 표시합니다.
    • 주 가와 수량은 정수로 변환되어야 하며, 유효하지 않은 입력(예: 문자나 소수점 포함 값)이 들어오면 "주 가와 수량은 정수로 입력하세요"라는 메시지를 표시합니다.

 

사용 방법

  • 주식 종목, 주 가, 수량을 각각의 입력 필드에 입력합니다.
  • "비용 계산" 버튼을 클릭하여 결과를 확인합니다.
  • 오류가 발생하면 해당 메시지를 참고하여 입력을 수정합니다.

 

▣ 코드

import customtkinter as ctk

# Create the main window
root = ctk.CTk()
root.title("Stock Calculator")
root.geometry("250x300+10+100")  # Adjusted to shift left by 10 pixels (x=10)

# Configure columns to center the content with a left shift effect
root.columnconfigure(0, weight=1)  # Left padding column
root.columnconfigure(1, weight=1)  # Center column for labels and entries
root.columnconfigure(2, weight=1)  # Right padding column

# Labels and Entry fields in horizontal layout
ctk.CTkLabel(root, text="주식 종목:").grid(row=0, column=1, padx=5, pady=5)
stock_item = ctk.CTkEntry(root)
stock_item.grid(row=0, column=2, padx=5, pady=5, sticky="w")

ctk.CTkLabel(root, text="주       가:").grid(row=1, column=1, padx=5, pady=5)
week_price = ctk.CTkEntry(root)
week_price.grid(row=1, column=2, padx=5, pady=5, sticky="w")

ctk.CTkLabel(root, text="수       량:").grid(row=2, column=1, padx=5, pady=5)
quantity_amount = ctk.CTkEntry(root)
quantity_amount.grid(row=2, column=2, padx=5, pady=5, sticky="w")

# Label to display result
result_label = ctk.CTkLabel(root, text="")
result_label.grid(row=5, column=1, columnspan=2, pady=10)

# Function to calculate cost and display result
def calculate_cost():
    try:
        # Get stock item (string)
        stock = stock_item.get().strip()
        if not stock:
            result_label.configure(text="주식 종목을 입력하세요")
            return

        # Get price and quantity (integers)
        p = week_price.get().strip()
        q = quantity_amount.get().strip()
        if not p or not q:
            result_label.configure(text="주 가와 수량을 입력하세요")
            return
        
        p = int(float(p))  # Convert to integer after ensuring it's a valid number
        q = int(float(q))  # Convert to integer after ensuring it's a valid number

        # Calculate total
        total = p * q
        # Display result with stock item and formatted total
        result_label.configure(text=f"{stock}: {total:,} 원")
    except ValueError:
        result_label.configure(text="주 가와 수량은 정수로 입력하세요")

# Calculate button using grid
calc_button = ctk.CTkButton(root, text="비용 계산", command=calculate_cost)
calc_button.grid(row=4, column=1, columnspan=2, pady=20, sticky="n")

# Start the application
root.mainloop()

1. 라이브러리 임포트

import customtkinter as ctk

customtkinter는 Tkinter를 기반으로 한 현대적인 UI를 제공하는 라이브러리입니다. 기본 Tkinter보다 더 세련된 위젯(버튼, 라벨, 입력창 등)을 제공합니다.

2. 메인 창 생성

root = ctk.CTk()
root.title("Stock Calculator")
root.geometry("250x300+10+100")
  • ctk.CTk(): 애플리케이션의 메인 창을 생성합니다.
  • root.title("Stock Calculator"): 창의 제목을 "Stock Calculator"로 설정합니다.
  • root.geometry("250x300+10+100"): 창의 크기를 250x300 픽셀로 설정하고, MS Window 화면의 x=10, y=100 위치에 창을 표시합니다. 이는 창을 화면 왼쪽 상단에서 약간 오른쪽(+10)과 아래(+100)로 이동시킵니다.

 

3. 그리드 레이아웃 설정

root.columnconfigure(0, weight=1)  # Left padding column
root.columnconfigure(1, weight=1)  # Center column for labels and entries
root.columnconfigure(2, weight=1)  # Right padding column
  • columnconfigure: 창의 열(column)을 설정하여 위젯을 배치할 그리드 레이아웃을 구성합니다.
  • 3개의 열(0, 1, 2)을 설정하고, 각 열의 weight=1로 동일한 비율로 확장되도록 합니다.
    • 열 0: 왼쪽 여백
    • 열 1: 라벨과 입력창이 위치할 중심 열
    • 열 2: 입력창이 위치하며 오른쪽 여백 역할도 겸함

4. 라벨과 입력창 생성

ctk.CTkLabel(root, text="주식 종목:").grid(row=0, column=1, padx=5, pady=5)
stock_item = ctk.CTkEntry(root)
stock_item.grid(row=0, column=2, padx=5, pady=5, sticky="w")

 

  • ctk.CTkLabel: "주식 종목:"이라는 텍스트 라벨을 생성하고, 그리드의 0행 1열에 배치합니다.
    • padx=5, pady=5: 위젯 주위에 5픽셀의 수평/수직 여백을 추가합니다.
  • ctk.CTkEntry: 사용자가 주식 종목을 입력할 텍스트 입력창을 생성하고, 0행 2열에 배치합니다.
    • sticky="w": 입력창을 열의 왼쪽(west)에 정렬합니다.
ctk.CTkLabel(root, text="주       가:").grid(row=1, column=1, padx=5, pady=5)
week_price = ctk.CTkEntry(root)
week_price.grid(row=1, column=2, padx=5, pady=5, sticky="w")

ctk.CTkLabel(root, text="수       량:").grid(row=2, column=1, padx=5, pady=5)
quantity_amount = ctk.CTkEntry(root)
quantity_amount.grid(row=2, column=2, padx=5, pady=5, sticky="w")

 

 

  • 동일한 방식으로 "주가"와 "수량" 라벨 및 입력창을 각각 1행과 2행에 배치합니다.
  • 입력창은 각각 week_pricequantity_amount 변수에 저장되어 나중에 입력값을 가져오는 데 사용됩니다.

5. 결과 표시 라벨

result_label = ctk.CTkLabel(root, text="")
result_label.grid(row=5, column=1, columnspan=2, pady=10)

 

 

  • result_label: 계산 결과를 표시할 빈 라벨을 생성합니다.
  • row=5, column=1, columnspan=2: 5행의 1열과 2열을 차지하도록 설정하여 결과가 중앙에 표시되도록 합니다.
  • pady=10: 위아래로 10픽셀 여백을 추가하여 시각적으로 여유롭게 배치합니다.

6. 계산 함수 정의

def calculate_cost():
    try:
        # Get stock item (string)
        stock = stock_item.get().strip()
        if not stock:
            result_label.configure(text="주식 종목을 입력하세요")
            return

 

 

  • calculate_cost: 계산 버튼 클릭 시 호출되는 함수입니다.
  • stock_item.get().strip(): 주식 종목 입력창에서 텍스트를 가져오고, 공백을 제거합니다.
  • if not stock: 주식 종목이 입력되지 않으면 오류 메시지를 표시하고 함수를 종료합니다.
        # Get price and quantity (integers)
        p = week_price.get().strip()
        q = quantity_amount.get().strip()
        if not p or not q:
            result_label.configure(text="주 가와 수량을 입력하세요")
            return

 

 

  • week_price.get().strip()quantity_amount.get().strip(): 주당 가격과 수량을 가져오고 공백을 제거합니다.
  • 입력값이 비어 있으면 오류 메시지를 표시하고 종료합니다.
        p = int(float(p))  # Convert to integer after ensuring it's a valid number
        q = int(float(q))  # Convert to integer after ensuring it's a valid number

 

  • 입력값을 float으로 변환한 후 int로 변환하여 정수로 만듭니다. 이는 소수점이 포함된 입력(예: "100.0")도 처리할 수 있도록 합니다.
        # Calculate total
        total = p * q
        # Display result with stock item and formatted total
        result_label.configure(text=f"{stock}: {total:,} 원")

 

  • total = p * q: 주당 가격과 수량을 곱해 총 비용을 계산합니다.
  • result_label.configure: 결과 라벨에 주식 종목과 계산된 총 비용을 표시합니다.
    • {total:,}: 천 단위로 쉼표를 추가해 숫자를 읽기 쉽게 포맷합니다(예: 1000000 → 1,000,000).
    except ValueError:
        result_label.configure(text="주 가와 수량은 정수로 입력하세요")
  • try-except: 입력값이 숫자로 변환할 수 없는 경우(예: 문자 입력) ValueError를 처리하며 오류 메시지를 표시합니다.

 

 

 

7. 계산 버튼

calc_button = ctk.CTkButton(root, text="비용 계산", command=calculate_cost)
calc_button.grid(row=4, column=1, columnspan=2, pady=20, sticky="n")

 

  • ctk.CTkButton: "비용 계산" 텍스트가 있는 버튼을 생성하고, 클릭 시 calculate_cost 함수를 호출하도록 설정합니다.
  • row=4, column=1, columnspan=2: 버튼을 4행의 1열과 2열에 걸쳐 중앙에 배치합니다.
  • pady=20: 위아래 여백을 20픽셀로 설정하여 시각적 간격을 확보합니다.
  • sticky="n": 버튼을 셀의 상단(north)에 정렬합니다.

8. 애플리케이션 실행

root.mainloop()

 

  • mainloop: 애플리케이션의 이벤트 루프를 시작하여 창을 열고 사용자 입력을 처리합니다.

 

동작 요약

  1. 사용자는 주식 종목, 주당 가격, 수량을 입력합니다.
  2. "비용 계산" 버튼을 클릭하면:
    • 입력값이 비어 있거나 유효하지 않으면 적절한 오류 메시지를 표시합니다.
    • 유효한 입력이면 총 비용(주당 가격 × 수량)을 계산하여 "{주식 종목}: {총 비용} 원" 형식으로 결과를 표시합니다.
  3. 예를 들어, 종목 "삼성전자", 주당 가격 "80000", 수량 "10"을 입력하면 결과는 "삼성전자: 800,000 원"으로 표시됩니다.

 

by korealionkk@gmail.com


반응형