'Python/GUI'에 해당되는 글 1건

  1. 2019.01.30 GUI example
Python/GUI2019. 1. 30. 16:07

Python 윈도우에 사용할 수 있는 주요 위젯 테스트


원문참고

https://www.tutorialspoint.com/python/python_gui_programming.htm


Python 은 GUI 프로그램을 지원하기 위해 tkinter 모듈을 내장하고 있으므로 그리 어렵지 않게 윈도우 프로그램을 작성할 수 있다


기본 윈도우 띄우기

import tkinter
top = tkinter.Tk()
top.title("기본 윈도우")
# Code to add widgets will go here...
top.mainloop()


버튼을 누르면  메시지박스를 띄운다

import tkinter
import tkinter.messagebox as mb

top = tkinter.Tk()
top.title("버튼 이벤트 핸들러")

def click_handler(): # 버튼을 누르면 실행될 클릭 이벤트 핸들러
mb.showinfo( "MessageBox 제목", "MessageBox 내용")

B = tkinter.Button(top, text="Click", command=click_handler)

B.pack()
top.mainloop()


캔바스에 그리기

import tkinter

top = tkinter.Tk()
top.title("캔바스에 그리기")

C = tkinter.Canvas(top, bg="orange", height=250, width=300)

coord = 10, 50, 240, 210
arc = C.create_arc(coord, start=0, extent=150, fill="red")

C.pack()
top.mainloop()



메뉴바, 메뉴, 메뉴버튼

import tkinter as tk

top = tk.Tk() 


위와 같이 생성된 윈도우가 있을 때 ...

메뉴바와 메뉴는 동일하게 Menu 클래스를 사용하여 생성한다


menubar = Menu(top)  --> 최상위 윈도우에 직접 붙인 메뉴는 실제적으로 메뉴바 역할을 한다

filemenu = Menu(menubar)  --> 메뉴바에 직접 붙인 메뉴는 실제적으로 메뉴 역할을 한다


그리고 아래처럼 메뉴에 추가하는 것은 각 메뉴의 하위메뉴, 즉 메뉴 아이템이 된다

filemenu.add_command()

filemenu.add_radiobutton()

filemenu.add_checkbutton() 


Menubutton 은 메뉴바에 붙이는 위젯이 아니라 윈도우 클라이언트 영역에 일반 위젯과 같은 방법으로 붙일 때 사용한다

mbtn = Menubutton(top, text="Language")

mbtn.place(x=100,y=100) # pack(), grid(row=0,column=0)



Menubutton (메뉴를 선택하면 이벤트 핸들러가 호출됨)

from tkinter import *


def on_menu():
print("메뉴 눌림")

root = Tk()
root.title("메뉴버튼 만들기")
root.geometry("300x200")

mbutton = Menubutton(root, text='Language')
mbutton.grid(row=0, column=0)
picks = Menu(mbutton)
picks.add_command(label='Java', command=on_menu)
picks.add_command(label='C++', command=root.quit)
picks.add_command(label='Python', command=root.quit)
mbutton.config(menu=picks, bg='cyan', bd=1, relief=RAISED)

mbutton2 = Menubutton(root, text='Fruits')
mbutton2.grid(row=0, column=1)
picks2 = Menu(mbutton2)
picks2.add_command(label='Apple', command=root.quit)
picks2.add_command(label='Orange', command=root.quit)
picks2.add_command(label='Mellon', command=root.quit)
mbutton2.config(menu=picks2, bg='orange', bd=1, relief=RAISED)

root.mainloop()



Menubutton의 아이템으로 Radiobutton을 설정하는 예

from tkinter import *


def on_menu():
i = radioVar.get()
if i==1 : print("New")
elif i==2 : print("Open")

root = Tk()
root.title("메뉴버튼 (Radiobutton)만들기")
root.geometry("300x200")

filemenu = Menubutton(root, text='File')
#filemenu.grid(row=0, column=0)
filemenu.place(x=100,y=50)

radioVar = IntVar()
radioVar.set(1)
menuitems = Menu(filemenu)

menuitems.add_radiobutton(label='New', variable=radioVar, value=1, command=on_menu)
menuitems.add_radiobutton(label='Open', variable=radioVar, value=2, command=on_menu)
menuitems.add_radiobutton(label='Exit', variable=radioVar, value=3, command=root.quit)
filemenu.config(menu=menuitems, bg='orange', bd=1, relief=RAISED)

root.mainloop()



Menubutton의 아이템으로 Checkbutton을 설정하는 예

from tkinter import *


def on_menu():
if gravityVar.get() : print("Gravity ON")
if dragVar.get() : print("Drag ON")
if frictionVar.get() : print("Friction ON")

root = Tk()
root.title("메뉴버튼 (Checkbutton)만들기")
root.geometry("300x200")

forcemenu = Menubutton(root, text='Forces')
#forcemenu.grid(row=0, column=0)
forcemenu.pack()

gravityVar = BooleanVar()
gravityVar.set(True)
dragVar = BooleanVar()
frictionVar = BooleanVar()

menuitems = Menu(forcemenu)

menuitems.add_checkbutton(label='Gravity', variable=gravityVar, \
onvalue=True, offvalue=False, command=on_menu)
menuitems.add_checkbutton(label='Drag', variable=dragVar, \
onvalue=True, offvalue=False, command=on_menu)
menuitems.add_checkbutton(label='Friction', variable=frictionVar, \
onvalue=True, offvalue=False, command=on_menu)
forcemenu.config(menu=menuitems, bg='orange', bd=1, relief=RAISED)

root.mainloop()



Menubar, Menu 기본 설정 예

import tkinter as tk

def menu_handler(): # 체크버튼 메뉴를 클릭할 때마다 실행되는 핸들러
if lineVar.get() : print("Line Settings 선택")
if colorVar.get() : print("Color Settings 선택")
if surfaceVar.get() : print("Surface Settings 선택")

top = tk.Tk()
top.title("메뉴 기본설정")
top.geometry("300x200")

menubar = tk.Menu(top) # 윈도우 아래에 바로 붙이는 것은 메뉴바

lineVar = tk.BooleanVar()
lineVar.set(True)
colorVar = tk.BooleanVar()
surfaceVar = tk.BooleanVar()

settings_menu = tk.Menu(menubar) # 메뉴바에 붙이는 것은 메뉴 아이템
settings_menu.add_command(label="Line", command=menu_handler)
settings_menu.add_command(label="Color", command=menu_handler)
settings_menu.add_command(label="Surface", command=menu_handler)
menubar.add_cascade(label='Settings', menu=settings_menu)

help_menu = tk.Menu(menubar)
help_menu.add_command(label="Version", command=top.quit)
menubar.add_cascade(label="Help", menu=help_menu)

top.config(menu=menubar)
top.mainloop()



Menubar, Menu (checkbutton) 메뉴를 선택하면 메뉴아이템에 체크표시가 되며 핸들러가 실행

import tkinter as tk

def menu_handler(): # 체크버튼 메뉴를 클릭할 때마다 실행되는 핸들러
if lineVar.get() : print("Line Settings 선택")
if colorVar.get() : print("Color Settings 선택")
if surfaceVar.get() : print("Surface Settings 선택")

top = tk.Tk()
top.title("메뉴버튼 체크버튼")
top.geometry("300x200")

menubar = tk.Menu(top) # 윈도우 아래에 바로 붙이는 것은 메뉴바

lineVar = tk.BooleanVar()
lineVar.set(True)
colorVar = tk.BooleanVar()
surfaceVar = tk.BooleanVar()

settings_menu = tk.Menu(menubar) # 메뉴바에 붙이는 것은 메뉴 아이템
settings_menu.add_checkbutton(label="Line", onvalue=1, offvalue=False, variable=lineVar, \
command=menu_handler)
settings_menu.add_checkbutton(label="Color", onvalue=True, offvalue=0, variable=colorVar, \
command=menu_handler)
settings_menu.add_checkbutton(label="Surface", onvalue=1, offvalue=0, variable=surfaceVar, \
command=menu_handler)
menubar.add_cascade(label='Settings', menu=settings_menu)

top.config(menu=menubar)
top.mainloop()



Menubar, Menu, Radiobutton(메뉴 아이템에 Radiobutton 이 표시됨)

import tkinter as tk

def menu_handler(): # 체크버튼 메뉴를 클릭할 때마다 실행되는 핸들러
i = radioVar.get()
if i==1 : print("Line Settings 선택")
if i==2 : print("Color Settings 선택")
if i==3 : print("Surface Settings 선택")

top = tk.Tk()
top.title("메뉴바와 메뉴 Radiobutton")
top.geometry("300x200")

menubar = tk.Menu(top) # 윈도우 아래에 바로 붙이는 것은 메뉴바

radioVar = tk.IntVar()
radioVar.set(1)

settings_menu = tk.Menu(menubar) # 메뉴바에 붙이는 것은 메뉴 아이템
settings_menu.add_radiobutton(label="Line", variable=radioVar, value=1, \
command=menu_handler)
settings_menu.add_radiobutton(label="Color", variable=radioVar, value=2, \
command=menu_handler)
settings_menu.add_radiobutton(label="Surface", variable=radioVar, value=3, \
command=menu_handler)
menubar.add_cascade(label='Settings', menu=settings_menu)

top.config(menu=menubar)
top.mainloop()



주요 위젯들 ( Label, Entry, Radiobutton, Checkbutton, Text, Scale, Spinbox )

Label : 다른 위젯과 함께 쓰여서 문자열을 표시함

Entry : 한 행의  문자열을 입력할 수 있는 위젯

Radiobutton : 단일 선택 수단을 제공함(동일변수를 사용해야 함)

Checkbutton : 다중선택 가능

Text : 다중행의 문자열을 표시

Scale : 수직, 수평 슬라이더. from_, to, resolution 속성으로 값을 설정할 수 있다

Spin : 상하 삼각형을 클릭하여 숫자를 올리고 내릴 수 있다


from tkinter import *

def sel(): # Radiobutton 핸들러
text.delete(1.0, END)
text.insert(INSERT, "선택: " + str(ivar.get() ) )

def on_button(): # 버튼 핸들러
text.delete(1.0, END)
text.insert(INSERT, entry.get() )

def on_button2(): # 버튼 핸들러
idx = Lb1.curselection()
txt = Lb1.get(idx)
text.delete(1.0, END)
text.insert(INSERT, txt)

def on_check() : # Checkbutton 핸들러
text.delete(1.0, END)
text.insert(INSERT, f"CB1:{checkVar1.get()}, CB2:{checkVar2.get()}")

def on_change(v) : # Scale 위젯 이벤트 핸들러
#print("Scale:"+str(v))
#print("Scale:"+str(scale.get()))
text.delete(1.0, END)
text.insert(INSERT, str(scale.get()))

def on_spin():
text.delete(1.0, END)
text.insert(INSERT, str(spin.get()) )

root = Tk()
root.title("주요 Widget 테스트")
root.geometry("400x300")

label = Label( root, text="숫자입력" )
label.place(x=10, y=10)

entry = Entry(root, bd=1, width=5)
entry.place(x=70, y=10 )

bt = Button(root, text="확인", width=10, command=on_button )
bt.place(x=120, y=10)

ivar = IntVar()
radio1 = Radiobutton(root, text="Option 1", variable=ivar, value=1, command=sel)
radio2 = Radiobutton(root, text="Option 2", variable=ivar, value=2, command=sel)
radio1.place(x=10, y=50)
radio2.place(x=100, y=50)

Lb1 = Listbox(root, width=20, height=3)
Lb1.insert(1, "Python")
Lb1.insert(2, "Java")
Lb1.insert(3, "C++")
Lb1.place(x=10, y=100)

text = Text(root, width=30, height=1)
text.place(x=170, y=100)

bt2 = Button(root, text="리스트박스 선택확인", width=20, command=on_button2 )
bt2.place(x=170, y=130)

checkVar1 = IntVar()
checkVar2 = IntVar()
check1 = Checkbutton(root, text = "Movie", variable = checkVar1, \
onvalue = 1, offvalue = 0, height=1, width = 10, command=on_check)
check2 = Checkbutton(root, text = "Game", variable = checkVar2, \
onvalue = 1, offvalue = 0, height=1, width = 10, command=on_check)
check1.place(x=1, y=200)
check2.place(x=80, y=200)

scaleVar = DoubleVar()
scale = Scale( root, variable=scaleVar, orient=HORIZONTAL, command=on_change )
#scale = Scale( root, variable=scaleVar, from_=0.0, to=1.0, resolution=0.01,\
# orient=HORIZONTAL, command=on_change )
scale.place(x=170, y=160)

spin = Spinbox(root, from_=0, to=10, command=on_spin)
spin.place(x=170, y=220)

root.mainloop()


Posted by cwisky