블로그 이미지
조이키트 블로그
아두이노, 라즈베리파이, 반도체 센서/모듈 활용

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

Notice

250x250
2024. 8. 10. 12:20 파이썬 GUI
728x90
반응형

파이썬 GUI로 간편 계산기를 만들어 보겠다.

파이썬 GUI로 전자 계산기를 만들기 위해서는 tkinter 라이브러리를 활용할 수 있다.

tkinter 라이브러리는 파이썬 표준 라이브러리로 간단한 GUI 애플리케이션을 만들 때 자주 사용된다.

 

그럼 이제부터 파이썬 GUI로 계산기를 만드는 과정을 설명하겠다.

먼저 Visual Studio Code를 실행하고 새로운 파일을 하나 만든다.

파일 이름을 calculator_GUI.py로 정하고 저장한 다음 다음과 같이 코드를 작성한다.

 

아래는 tkinter 라이브러리를 사용하여 전자계산기를 만든 파이썬 코드이다.

 

전체 코드 : 

import tkinter as tk

# 계산기 클래스
class Calculator:
    def __init__(self, root):
        self.root = root
        self.root.title("전자 계산기")

        # 입력창
        self.entry = tk.Entry(root, width=16, font=('Arial', 24), borderwidth=2, relief='solid')
        self.entry.grid(row=0, column=0, columnspan=4)

        # 버튼들
        buttons = [
            '(', ')', 'C', '/',
            '7', '8', '9', '*',
            '4', '5', '6', '-',
            '1', '2', '3', '+',
            '0', '.', '='
        ]

        # 버튼 생성 및 배치
        row_val = 1
        col_val = 0
        for button in buttons:
            if button == '0':
                tk.Button(root, text=button, width=11, height=2, font=('Arial', 18), command=lambda b=button: self.click(b)).grid(row=row_val, column=0, columnspan=2)
                col_val += 2  # '0' 버튼은 두 칸을 차지하므로 col_val을 2 증가시킴
            else:
                tk.Button(root, text=button, width=5, height=2, font=('Arial', 18), command=lambda b=button: self.click(b)).grid(row=row_val, column=col_val)
                col_val += 1
                if col_val > 3:
                    col_val = 0
                    row_val += 1

    # 버튼 클릭 이벤트 처리
    def click(self, button):
        if button == "=":
            try:
                result = str(eval(self.entry.get()))
                self.entry.delete(0, tk.END)
                self.entry.insert(tk.END, result)
            except Exception as e:
                self.entry.delete(0, tk.END)
                self.entry.insert(tk.END, "Error")
        elif button == "C":
            self.entry.delete(0, tk.END)
        else:
            self.entry.insert(tk.END, button)

# 메인 실행 부분
if __name__ == "__main__":
    root = tk.Tk()
    calculator = Calculator(root)
    root.mainloop()

 

코드 설명 : 

1. Calculator 클래스 : 계산기의 전체 구조를 관리하는 클래스이다.

    . '__init__' 메서드에서 버튼과 입력창을 설정한다.

    . 'click' 메서드는 버튼을 눌렀을 때 실행되는 동작을 정의한다.

# 계산기 클래스
class Calculator:
    def __init__(self, root):
        self.root = root
        self.root.title("Calculator")

 

2. 입력창 : 사용자가 입력한 계산식을 표시한다.

# 입력창
        self.entry = tk.Entry(root, width=16, font=('Arial', 24), borderwidth=2, relief='solid')
        self.entry.grid(row=0, column=0, columnspan=4)

여기서는 계산기 디자인의 너비, 폰트, 행, 열 등을 설정한다.

 

3. 버튼들 : 숫자와 연산자를 포함한 계산기의 버튼을 생성한다. 각 버튼은 'click' 메서드에 연결되어 클릭 시 동작을 수행한다.

# 버튼들
        buttons = [
            '(', ')', 'C', '/',
            '7', '8', '9', '*',
            '4', '5', '6', '-',
            '1', '2', '3', '+',
            '0', '.', '='
        ]

        # 버튼 생성 및 배치
        row_val = 1
        col_val = 0
        for button in buttons:
            if button == '0':
                tk.Button(root, text=button, width=11, height=2, font=('Arial', 18), command=lambda b=button: self.click(b)).grid(row=row_val, column=0, columnspan=2)
                col_val += 2  # '0' 버튼은 두 칸을 차지하므로 col_val을 2 증가시킴
            else:
                tk.Button(root, text=button, width=5, height=2, font=('Arial', 18), command=lambda b=button: self.click(b)).grid(row=row_val, column=col_val)
                col_val += 1
                if col_val > 3:
                    col_val = 0
                    row_val += 1

 

4. 연산처리 : '=' 버튼을 눌렀을 때 'eval' 함수를 사용하여 입력된 수식을 계산한다.

 # 버튼 클릭 이벤트 처리
    def click(self, button):
        if button == "=":
            try:
                result = str(eval(self.entry.get()))
                self.entry.delete(0, tk.END)
                self.entry.insert(tk.END, result)
            except Exception as e:
                self.entry.delete(0, tk.END)
                self.entry.insert(tk.END, "Error")
        elif button == "C":
            self.entry.delete(0, tk.END)
        else:
            self.entry.insert(tk.END, button)

 

위와 같이 코드를 전부 작성한 다음 메뉴 실행에서 디버깅을 시작한다. 

그러면 다음과 같이 GUI 계산기가 만들어 진것을 볼 수 있다.

간편 전자 계산기 실행 이미지

 

728x90
반응형
posted by 조이키트 블로그
2024. 1. 15. 18:40 파이썬 GUI
728x90
반응형

여기서는 tkinter 캔버스 위젯을 사용해 GUI에 극적인 색상 효과를 추가하는 방법을 보여준다.

 

먼저 GUI에 새로운 탭 tab3을 만든다.

tab3 = ttk.Frame(tabControl)
tabControl.add(tab3, text='Tab 3') # 세번째 탭 추가하기
tabControl.pack(expand=1, fill="both")  # 탭을 나타내기 위 패킹하기

 

다음으로 tkinter의 또 다른 내장 위젯 Canvas를 호출한다.

# Tab Control 3
tab3_frame = tk.Frame(tab3, bg='blue')
tab3_frame.pack()
for orange_color in range(2):
    canvas = tk.Canvas(tab3_frame, width=150, height=80, highlightthickness=0, bg='orange')
    canvas.grid(row=orange_color, column=orange_color)

 

코드 설명

새탭을 만든 후에는 일반 tk.Frame을 배치하고 배경색을 파란색으로 지정한다. 

루프에서 두 개의 tk.Canvas 위젯을 만들어 그리드 좌표 0, 0과  1, 1에 오랜지색을 할당한다.  또한 두 개의 다른 격자 위치에서 tk.Frame의 파란색 배경색을 볼 수 있다. 

 

전체 코드

import tkinter as tk      
from tkinter import ttk  # ttk를 임포트 함
from tkinter import scrolledtext
from tkinter import Menu
from tkinter import messagebox as msg
from tkinter import Spinbox
from tkinter import SCROLL
from time import sleep


win = tk.Tk()  # Tk 클래스의 인스턴스 생성
win.title("파이썬 GUI")   # 제목을 설정하기 위한 인스턴스 변수 사용
win.iconbitmap('pyc.ico')
tabControl = ttk.Notebook(win) # 탭 컨트롤 생성하기
tab1 = ttk.Frame(tabControl)   # 탭 생성하기
tabControl.add(tab1, text='Tab 1') # 탭 추가하기

tab2 = ttk.Frame(tabControl)
tabControl.add(tab2, text='Tab 2')  # 두번째 탭 추가하기
tabControl.pack(expand=1, fill="both")

tab3 = ttk.Frame(tabControl)
tabControl.add(tab3, text='Tab 3') # 세번째 탭 추가하기
tabControl.pack(expand=1, fill="both")  # 탭을 나타내기 위 패킹하기

# tab1을 부모로 사용한 라벨프레임
mighty = ttk.LabelFrame(tab1, text=' Mighty Python ')
mighty.grid(column=0, row=0, padx=8, pady=4)

# mighty를 부모로 사용한 라벨
a_label = ttk.Label(mighty, text="Enter a name:")
a_label.grid(column=0, row=0, sticky='W')

name = tk.StringVar()  # StringVar 변수를 생성하고 tkinter의 별칭으로 tk를 사용
name_entered = ttk.Entry(mighty, width=12, textvariable=name) # ttk.Entry 위젯을 생성하고 다른 변수에 할당
name_entered.grid(column=0, row=1) # 위젯의 위치 지정
name_entered.focus()

# 다른 라벨 추가하기
ttk.Label(mighty, text="Choose a number:").grid(column=1, row=0)

number = tk.StringVar()
number_chosen = ttk.Combobox(mighty, width=12, textvariable=number)  # ttk.Combobox 위젯 생성
number_chosen['values'] = (1, 2, 4, 10, 100) # 콤보박스 위젯 값 할당
number_chosen.grid(column=1, row=1) # 콤보박스 위젯 위치 지정
number_chosen.current(0)

def click_me():  # click_me() 함수 정의 
    action.configure(text='Hello ' + name.get())
    a_label.configure(foreground='red')
    

action = ttk.Button(mighty, text="Click Me!", command=click_me) # ttkfmf 사용해 버튼을 생성하고 text 속성을 전잘 
action.grid(column=2, row=1)
action.configure(state='enable')

# Spinbox 콜백
def _spin():
    value = spin.get()
    print(value)
#    scrol.insert(tk.INSERT, value + 'n')

# Spinbox2 콜백
def _spin2():
    value = spin2.get()
    print(value)
 #   scrol.insert(tk.INSERT, value + '\n')

# Spinbox 위젯 추가하기
spin = Spinbox(mighty, from_=0, to=10, width=10, bd=8, command=_spin)
spin.grid(column=0, row=2)
spin2 = Spinbox(mighty, values=('0 50 100'), width=10, bd=8, command=_spin2, relief=tk.RIDGE)
spin2.grid(column=1, row=2)
spin3 = Spinbox(mighty, values=('0 50 100'), width=10, bd=8, command=_spin2, relief=tk.FLAT)
spin3.grid(column=2, row=2)


# 스크롤되는 텍스트 위젯
scrol_w = 50  # 높이와 넓이를 위한 변수 정의 
scrol_h = 5

# ScrolledText 위젯 생성
scr = scrolledtext.ScrolledText(mighty, width=scrol_w, height=scrol_h, wrap=tk.WORD)
scr.grid(column=0, row=5, sticky='WE', columnspan=3) # 스크롤 위젯의 위치 지정

mighty2 = ttk.LabelFrame(tab2, text= 'The Snake ')
mighty2.grid(column=0, row=0, padx=8, pady=4)

chVarDis = tk.IntVar()
check1 = tk.Checkbutton(mighty2, text="Disabled", variable=chVarDis, state='disabled')
check1.select()  # 상태를 select로 설정
check1.grid(column=0, row=4, sticky=tk.W, padx= 20, pady=10)  # 체크박스 위치 지정

chVarUn = tk.IntVar()  
check2 = tk.Checkbutton(mighty2, text="UnChecked", variable=chVarUn)
check2.deselect()  # 상태를 deselect로 설정
check2.grid(column=1, row=4, sticky=tk.W, padx= 20, pady=10)

chVarEn = tk.IntVar()   # tk.IntVar 인스턴스 생성
check3 = tk.Checkbutton(mighty2, text="Enabled", variable=chVarEn)
check3.select()  # 상태를 select로 설정
check3.grid(column=2, row=4, sticky=tk.W, padx= 20, pady=10)

# 생상 이름을 저장하는 모듈 레벨의 전역변수 생성
COLOR1 = "Blue"
COLOR2 = "Gold"
COLOR3 = "Red"

# 라디오 버튼을 위한 콜백함수 생성
def radCall():
    radSel=radVar.get()
    if   radSel == 1: mighty2.configure(tex=COLOR1)
    elif radSel == 2: mighty2.configure(text=COLOR2)
    elif radSel == 3: mighty2.configure(text=COLOR3)

# 1개의 변수를 사용하여 3개의 라디오버튼 생성
radVar = tk.IntVar()
 
# 3개의 tk 라디오 버튼 생성
for col in range(3):
    curRad = tk.Radiobutton(mighty2, variable=radVar, value=col, command=radCall)
    curRad.grid(column=col, row=6, sticky=tk.W)

# Tab2에 프로그레스바 추가
    progress_bar = ttk.Progressbar(tab2, orient='horizontal', length=286, mode='determinate')
    progress_bar.grid(column=0, row=3, pady=2)

# 콜백 함수에서 상태바 업데이트 하기
def run_progressbar():
    progress_bar["maximum"] = 100
    for i in range(101):
        sleep(0.05)
        progress_bar["value"] = i # 프로그레스바 증가시키기
        progress_bar.update()     # 순환문에서 update() 호출
        progress_bar["value"] = 0 # 프로그레스바 리셋 및 정리

# start 프로그레스바
def start_progressbar():
    progress_bar.start()

# stop 프로그레스바
def stop_progressbar():
    progress_bar.stop()

# 0.1초 후 프로그레스바 stop 
def progressbar_stop_after(wait_ms=1000):
    win.after(wait_ms, progress_bar.stop)

# 프로그레스바를 담기 위한 컨테이너 생성
buttons_frame = ttk.LabelFrame(mighty2, text=' ProgressBar ')
buttons_frame.grid(column=0, row=7, sticky='W', columnspan=2, padx=20, pady=40)

# Progressbar 명령 버튼을 추가
ttk.Button(buttons_frame, text=" Run Progressbar ", command=run_progressbar).grid(column=0, row=0, sticky='W')
ttk.Button(buttons_frame, text=" Start Progressbar ", command=start_progressbar).grid(column=0, row=1, sticky='W')
ttk.Button(buttons_frame, text=" Stop immediately ", command=stop_progressbar).grid(column=0, row=2, sticky='W')
ttk.Button(buttons_frame, text=" Stop after second ", command=progressbar_stop_after).grid(column=0, row=3, sticky='W')

# 순환문에 buttons_frame의 자식인 추가적인 패딩 추가
for child in buttons_frame.winfo_children():
    child.grid_configure(padx=2, pady=2)

# Tab2의 자식으로 추가적인 패딩 추가
for child in mighty2.winfo_children():
    child.grid_configure(padx=8, pady=2)


# 각 라벨 주변에 공간 추가하기
for child in mighty.winfo_children():
    child.grid_configure(padx=8)

for child in mighty2.winfo_children():
    child.grid_configure(padx=8)

# Tab Control 3
tab3_frame = tk.Frame(tab3, bg='blue')
tab3_frame.pack()
for orange_color in range(2):
    canvas = tk.Canvas(tab3_frame, width=150, height=80, highlightthickness=0, bg='orange')
    canvas.grid(row=orange_color, column=orange_color)

# 메뉴바 생성하기
menu_bar = Menu(win)
win.config(menu=menu_bar)

def _quit():
    win.quit()
    win.destroy()
    exit()

# 메뉴를 생성하고 메뉴 아이템 추가하기
file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="New")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=_quit)
menu_bar.add_cascade(label="File", menu=file_menu)

def _msgBox():
    msg.showinfo('Python Message Info Box', 'A Python GUI created using tkinter' 'This year is 2024.')
    msg.showwarning('Python Message Warning Box', 'A Python GUI created using tkinter' '\nWarning: There might be a bug in this code.')
    msg.showerror('Python Message Error Box', 'A Python GUI created using tkinter:' '\nError : Houston ~ we Do have a serious PROBLEM!')
    answer = msg.askyesnocancel("Python Message Multi Choice Box", "Are you sure you really wish to do this?")


help_menu = Menu(menu_bar, tearoff=0)
help_menu.add_command(label="About", command=_msgBox)
menu_bar.add_cascade(label="Help", menu=help_menu)


win.mainloop()

 

 

 

728x90
반응형
posted by 조이키트 블로그
2024. 1. 3. 20:05 파이썬 GUI
728x90
반응형

메시지 박스는 사용자에게 피드백을 제공하는 팝업창이며, 잠재적 문제와 치명적인 오류를 암시하는 정보가 될 수 있다.

먼저 Help>About 메뉴를 만들고 About 메뉴를 클릭시 정보, 경고, 에러 메시지를 출력하는 프로그램을 만든다.

 

출력된 메시지 박스

 

 

전체코드

import tkinter as tk      
from tkinter import ttk  # ttk를 임포트 함
from tkinter import Menu
from tkinter import messagebox as msg

win = tk.Tk()  # Tk 클래스의 인스턴스 생성
win.title("GUI Message_Box")   # 제목을 설정하기 위한 인스턴스 변수 사용

# 메뉴바 생성하기
menu_bar = Menu(win)
win.config(menu=menu_bar)

def _quit():
    win.quit()
    win.destroy()
    exit()

# 메뉴를 생성하고 메뉴 아이템 추가하기
file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="New")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=_quit)
menu_bar.add_cascade(label="File", menu=file_menu)

def _msgBox():
    msg.showinfo('Python Message Info Box', 'A Python GUI created using tkinter' 'This year is 2024.')
    msg.showwarning('Python Message Warning Box', 'A Python GUI created using tkinter' '\nWarning: There might be a bug in this code.')
    msg.showerror('Python Message Error Box', 'A Python GUI created using tkinter:' '\nError : Houston ~ we Do have a serious PROBLEM!')
    answer = msg.askyesnocancel("Python Message Multi Choice Box", "Are you sure you really wish to do this?")


help_menu = Menu(menu_bar, tearoff=0)
help_menu.add_command(label="About", command=_msgBox)
menu_bar.add_cascade(label="Help", menu=help_menu)


win.mainloop()

 

코드 설명

 

import문이 있는 모듈의 맨 위에 다음 코드를 추가한다.

from tkinter import messagebox as msg

 

다음 메시지박스를 표시하는 4개의 콜백함수를 만든다.

def _msgBox():
    msg.showinfo('Python Message Info Box', 'A Python GUI created using tkinter' 'This year is 2024.')
    msg.showwarning('Python Message Warning Box', 'A Python GUI created using tkinter' '\nWarning: There might be a bug in this code.')
    msg.showerror('Python Message Error Box', 'A Python GUI created using tkinter:' '\nError : Houston ~ we Do have a serious PROBLEM!')
    answer = msg.askyesnocancel("Python Message Multi Choice Box", "Are you sure you really wish to do this?")

 

콜백함수를 추가하고 클릭 이벤트를 처리하기 위해 Helf 메뉴 명령 속성에 추가했다.

help_menu = Menu(menu_bar, tearoff=0)
help_menu.add_command(label="About", command=_msgBox)
menu_bar.add_cascade(label="Help", menu=help_menu)

 

askyesnocancel 메시지 박스는 사용자가 클릭한 버튼에 따라 다른 값을 반환한다. 답을 변수에 캡처해 어떤 답을 선택했는지에 따라 다른 코드를 쓸 수 있다. 

728x90
반응형
posted by 조이키트 블로그
2024. 1. 2. 20:07 파이썬 GUI
728x90
반응형

여기서는 간단한 GUI를 만든 다음 이전 레시피의 위젯을 추가하고 이를 새로운 탭 레이아웃에 배치한다.

 

Tab1과 Tab2를 추가하여 만들어진 완성된 GUI의 모습이다.

 

 

전체코드

import tkinter as tk      
from tkinter import ttk  # ttk를 임포트 함
from tkinter import scrolledtext
from tkinter import Menu

win = tk.Tk()  # Tk 클래스의 인스턴스 생성
win.title("파이썬 GUI")   # 제목을 설정하기 위한 인스턴스 변수 사용
tabControl = ttk.Notebook(win)
tab1 = ttk.Frame(tabControl)
tabControl.add(tab1, text='Tab 1')
tab2 = ttk.Frame(tabControl)
tabControl.add(tab2, text='Tab 2')
tabControl.pack(expand=1, fill="both")

# tab1을 부모로 사용한 라벨프레임
mighty = ttk.LabelFrame(tab1, text=' Mighty Python ')
mighty.grid(column=0, row=0, padx=8, pady=4)

# mighty를 부모로 사용한 라벨
a_label = ttk.Label(mighty, text="Enter a name:")
a_label.grid(column=0, row=0, sticky='W')

name = tk.StringVar()  # StringVar 변수를 생성하고 tkinter의 별칭으로 tk를 사용
name_entered = ttk.Entry(mighty, width=12, textvariable=name) # ttk.Entry 위젯을 생성하고 다른 변수에 할당
name_entered.grid(column=0, row=1) # 위젯의 위치 지정
name_entered.focus()

# 다른 라벨 추가하기
ttk.Label(mighty, text="Choose a number:").grid(column=1, row=0)

number = tk.StringVar()
number_chosen = ttk.Combobox(mighty, width=12, textvariable=number)  # ttk.Combobox 위젯 생성
number_chosen['values'] = (1, 2, 4, 10, 100) # 콤보박스 위젯 값 할당
number_chosen.grid(column=1, row=1) # 콤보박스 위젯 위치 지정
number_chosen.current(0)

def click_me():  # click_me() 함수 정의 
    action.configure(text='Hello ' + name.get())
    a_label.configure(foreground='red')
    

action = ttk.Button(mighty, text="Click Me!", command=click_me) # ttkfmf 사용해 버튼을 생성하고 text 속성을 전잘 
action.grid(column=2, row=1)
action.configure(state='enable')

# 스크롤되는 텍스트 위젯
scrol_w = 50  # 높이와 넓이를 위한 변수 정의 
scrol_h = 5

# ScrolledText 위젯 생성
scr = scrolledtext.ScrolledText(mighty, width=scrol_w, height=scrol_h, wrap=tk.WORD)
scr.grid(column=0, row=5, columnspan=3) # 스크롤 위젯의 위치 지정

mighty2 = ttk.LabelFrame(tab2, text= 'The Snake ')
mighty2.grid(column=0, row=0, padx=8, pady=4)

chVarDis = tk.IntVar()
check1 = tk.Checkbutton(mighty2, text="Disabled", variable=chVarDis, state='disabled')
check1.select()  # 상태를 select로 설정
check1.grid(column=0, row=4, sticky=tk.W, padx= 20, pady=10)  # 체크박스 위치 지정

chVarUn = tk.IntVar()  
check2 = tk.Checkbutton(mighty2, text="UnChecked", variable=chVarUn)
check2.deselect()  # 상태를 deselect로 설정
check2.grid(column=1, row=4, sticky=tk.W, padx= 20, pady=10)

chVarEn = tk.IntVar()   # tk.IntVar 인스턴스 생성
check3 = tk.Checkbutton(mighty2, text="Enabled", variable=chVarEn)
check3.select()  # 상태를 select로 설정
check3.grid(column=2, row=4, sticky=tk.W, padx= 20, pady=10)

# 생상 이름을 저장하는 모듈 레벨의 전역변수 생성
COLOR1 = "Blue"
COLOR2 = "Gold"
COLOR3 = "Red"

# 라디오 버튼을 위한 콜백함수 생성
def radCall():
    radSel=radVar.get()
    if   radSel == 1: mighty2.configure(tex=COLOR1)
    elif radSel == 2: mighty2.configure(text=COLOR2)
    elif radSel == 3: mighty2.configure(text=COLOR3)

# 1개의 변수를 사용하여 3개의 라디오버튼 생성
radVar = tk.IntVar()
 
# 3개의 tk 라디오 버튼 생성
rad1 = tk.Radiobutton(mighty2, text=COLOR1, variable=radVar, value=1, command=radCall)
rad1.grid(column=0, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)  # 그리드 레이아웃을 사용해 위치 지정

rad2 = tk.Radiobutton(mighty2, text=COLOR2, variable=radVar, value=2, command=radCall)
rad2.grid(column=1, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)

rad3 = tk.Radiobutton(mighty2, text=COLOR3, variable=radVar, value=3, command=radCall)
rad3.grid(column=2, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)


# 각 라벨 주변에 공간 추가하기
for child in mighty.winfo_children():
    child.grid_configure(padx=8)

for child in mighty2.winfo_children():
    child.grid_configure(padx=8)

# 메뉴바 생성하기
menu_bar = Menu(win)
win.config(menu=menu_bar)

def _quit():
    win.quit()
    win.destroy()
    exit()

# 메뉴를 생성하고 메뉴 아이템 추가하기
file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="New")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=_quit)
menu_bar.add_cascade(label="File", menu=file_menu)

help_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="Help", menu=help_menu)
help_menu.add_command(label="About")

#라벨 프레임
buttons_frame = ttk.LabelFrame(mighty2, text=' Labels in a Frame ')
buttons_frame.grid(column=0, row=7, padx=20, pady=40)

ttk.Label(buttons_frame, text="Label1").grid(column=0, row=0, sticky=tk.W, padx= 20, pady=10)
ttk.Label(buttons_frame, text="Label2").grid(column=1, row=0, sticky=tk.W, padx= 20, pady=10)
ttk.Label(buttons_frame, text="Label3").grid(column=2, row=0, sticky=tk.W, padx= 20, pady=10)


win.mainloop()

 

코드 설명

모듈의 최상단에 tkinter를 임포트한다.

import tkinter as tk      
from tkinter import ttk  # ttk를 임포트 함

 

Tk 클래스의 인스턴스를 생성한다.

win = tk.Tk()  # Tk 클래스의 인스턴스 생성

 

ttk 노트북을 사용해 탭컨트롤을 생성한다.

tabControl = ttk.Notebook(win)

 

탭컨트롤에 Tab1과 Tab2를 추가한다.

tab1 = ttk.Frame(tabControl)
tabControl.add(tab1, text='Tab 1')
tab2 = ttk.Frame(tabControl)
tabControl.add(tab2, text='Tab 2')

 

 

pack을 사용해 GUI 내부에 컨트롤을 가시화한다.

tabControl.pack(expand=1, fill="both")

 

라벨을 라벨프레임에 추가한다.

mighty = ttk.LabelFrame(tab1, text=' Mighty Python ')
mighty.grid(column=0, row=0, padx=8, pady=4)

 

# mighty를 부모로 사용한 라벨
a_label = ttk.Label(mighty, text="Enter a name:")
a_label.grid(column=0, row=0, sticky='W')

 

Tab1에는 위의 화면상에 Enter a name, Choose a number, Click Me!, 스크롤 위젯 기능이 들어간 부분을  mighty라는 변수를 사용해 적용시켰다. 

# mighty를 부모로 사용한 라벨
a_label = ttk.Label(mighty, text="Enter a name:")
a_label.grid(column=0, row=0, sticky='W')

name = tk.StringVar()  # StringVar 변수를 생성하고 tkinter의 별칭으로 tk를 사용
name_entered = ttk.Entry(mighty, width=12, textvariable=name) # ttk.Entry 위젯을 생성하고 다른 변수에 할당
name_entered.grid(column=0, row=1) # 위젯의 위치 지정
name_entered.focus()

# 다른 라벨 추가하기
ttk.Label(mighty, text="Choose a number:").grid(column=1, row=0)

number = tk.StringVar()
number_chosen = ttk.Combobox(mighty, width=12, textvariable=number)  # ttk.Combobox 위젯 생성
number_chosen['values'] = (1, 2, 4, 10, 100) # 콤보박스 위젯 값 할당
number_chosen.grid(column=1, row=1) # 콤보박스 위젯 위치 지정
number_chosen.current(0)

def click_me():  # click_me() 함수 정의 
    action.configure(text='Hello ' + name.get())
    a_label.configure(foreground='red')
    

action = ttk.Button(mighty, text="Click Me!", command=click_me) # ttkfmf 사용해 버튼을 생성하고 text 속성을 전잘 
action.grid(column=2, row=1)
action.configure(state='enable')

# 스크롤되는 텍스트 위젯
scrol_w = 50  # 높이와 넓이를 위한 변수 정의 
scrol_h = 5

# ScrolledText 위젯 생성
scr = scrolledtext.ScrolledText(mighty, width=scrol_w, height=scrol_h, wrap=tk.WORD)
scr.grid(column=0, row=5, columnspan=3) # 스크롤 위젯의 위치 지정

 

Tab2에는 체크박스, 라디오 버튼, Labels in a Frame  기능이 들어간 부분을 mighty2라는 변수를 사용해 적용시켰다.

mighty2 = ttk.LabelFrame(tab2, text= 'The Snake ')
mighty2.grid(column=0, row=0, padx=8, pady=4)

chVarDis = tk.IntVar()
check1 = tk.Checkbutton(mighty2, text="Disabled", variable=chVarDis, state='disabled')
check1.select()  # 상태를 select로 설정
check1.grid(column=0, row=4, sticky=tk.W, padx= 20, pady=10)  # 체크박스 위치 지정

chVarUn = tk.IntVar()  
check2 = tk.Checkbutton(mighty2, text="UnChecked", variable=chVarUn)
check2.deselect()  # 상태를 deselect로 설정
check2.grid(column=1, row=4, sticky=tk.W, padx= 20, pady=10)

chVarEn = tk.IntVar()   # tk.IntVar 인스턴스 생성
check3 = tk.Checkbutton(mighty2, text="Enabled", variable=chVarEn)
check3.select()  # 상태를 select로 설정
check3.grid(column=2, row=4, sticky=tk.W, padx= 20, pady=10)

# 생상 이름을 저장하는 모듈 레벨의 전역변수 생성
COLOR1 = "Blue"
COLOR2 = "Gold"
COLOR3 = "Red"

# 라디오 버튼을 위한 콜백함수 생성
def radCall():
    radSel=radVar.get()
    if   radSel == 1: mighty2.configure(tex=COLOR1)
    elif radSel == 2: mighty2.configure(text=COLOR2)
    elif radSel == 3: mighty2.configure(text=COLOR3)

# 1개의 변수를 사용하여 3개의 라디오버튼 생성
radVar = tk.IntVar()
 
# 3개의 tk 라디오 버튼 생성
rad1 = tk.Radiobutton(mighty2, text=COLOR1, variable=radVar, value=1, command=radCall)
rad1.grid(column=0, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)  # 그리드 레이아웃을 사용해 위치 지정

rad2 = tk.Radiobutton(mighty2, text=COLOR2, variable=radVar, value=2, command=radCall)
rad2.grid(column=1, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)

rad3 = tk.Radiobutton(mighty2, text=COLOR3, variable=radVar, value=3, command=radCall)
rad3.grid(column=2, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)

#라벨 프레임
buttons_frame = ttk.LabelFrame(mighty2, text=' Labels in a Frame ')
buttons_frame.grid(column=0, row=7, padx=20, pady=40)

ttk.Label(buttons_frame, text="Label1").grid(column=0, row=0, sticky=tk.W, padx= 20, pady=10)
ttk.Label(buttons_frame, text="Label2").grid(column=1, row=0, sticky=tk.W, padx= 20, pady=10)
ttk.Label(buttons_frame, text="Label3").grid(column=2, row=0, sticky=tk.W, padx= 20, pady=10)

 

위의 코드들을 보면 각 부분들의 구체적인 설명은 하지 않았다. 다만 Tab1과 Tab2를 mighty와 mighty2라는 변수로 부모 컨테이너를 지정해 일부 기능들을 분류하여 적용하는데 중점적으로 설명하였다.

728x90
반응형
posted by 조이키트 블로그
2024. 1. 2. 19:52 파이썬 GUI
728x90
반응형

여기서는 메인 윈도우에 메뉴바를 추가하고 메뉴 막대에 메뉴항목을 추가한다.

 

맥북에서 메뉴바가 만들어진 모습

 

전체코드

import tkinter as tk      
from tkinter import ttk  # ttk를 임포트 함
from tkinter import scrolledtext
from tkinter import Menu

win = tk.Tk()  # Tk 클래스의 인스턴스 생성
win.title("메뉴바 만들기")   # 제목을 설정하기 위한 인스턴스 변수 사용

# 메뉴바 생성하기
menu_bar = Menu(win)
win.config(menu=menu_bar)

def _quit():
    win.quit()
    win.destroy()
    exit()

# 메뉴를 생성하고 메뉴 아이템 추가하기
file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="New")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=_quit)
menu_bar.add_cascade(label="File", menu=file_menu)

help_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="Help", menu=help_menu)
help_menu.add_command(label="About")

win.mainloop()

 

동작원리 

먼저 tkinter에서 Menu 클래스를 임포트해야 한다.

from tkinter import Menu

 

다음 메뉴바를 만든다. 

menu_bar = Menu(win)

Menu 모듈 클래스의 생성자를 호출하고 메인 GUI 인스턴스인 win을 전달한다. Menu 객체의 인스턴스를 menu_bar 변수에 저장한다.

win.config(menu=menu_bar)

다음 메뉴바에 메뉴 항목들을 배치한다. 여기서는 File에는 New, Exit를 나열하였고, Help메뉴에는 About항목을 나열하였다.

file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="New")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=_quit)
menu_bar.add_cascade(label="File", menu=file_menu)

help_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="Help", menu=help_menu)
help_menu.add_command(label="About")

 

Exit 항목에 _quit 함수를 사용해 클릭시 창이 닫기게 한다.

def _quit():
    win.quit()
    win.destroy()
    exit()

 

728x90
반응형
posted by 조이키트 블로그
prev 1 next