반응형
1. gui 환경 프로그래밍 tkinter
-- from tkinter import *
-- from tkinter import messagebox
-- from time import *
-- from tkinter.filedialog import *
-- import tkinter as tk
수정중
1. gui _ 1
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 10 09:32:07 2021
@author: 2016005
guiex1.py
"""
from tkinter import * # 파이썬은 기본적으로 제공되는 모듈.
from tkinter import messagebox
## 함수 선언 부분##
def clickImage(event): # 이미지를 클릭했을 때 메시지박스가 호출
messagebox.showinfo("마우스","토끼에서 마우스가 클릭됨")
## 메인 코드 부분 ##
window = Tk()
window.geometry("400x400")
photo = PhotoImage(file = "gif/rabbit.gif") # 이미지 메모리에 로드(상대경로)
labell = Label(window, image = photo)
# 위의 clickImage메서드를 <button>과 연결
# 이벤트 등록 : labell 객체를 클릭하면 clickImage함수 호출
labell.bind("<Button>", clickImage)
# labell을 윈도우에 보여지도록 추가.
# expand기본: 정가운데.
# pack - 위치지정
labell.pack(expand = 1, anchor = CENTER)
window.mainloop()
#window도 객체.
#window.mainloop() : 메모리에 다 저장했던것을 이제 화면에 다 출력해라
2. gui _2
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 10 10:14:38 2021
@author: 2016005
guiex2.py : 이미지 보기 예제
"""
from tkinter import *
from time import *
## 전역 변수 선언 부분 ##
fnameList = ["jeju1.gif", "jeju2.gif", "jeju3.gif",
"jeju4.gif", "jeju5.gif", "jeju6.gif",
"jeju7.gif", "jeju8.gif", "jeju9.gif"]
photoList = [None]*9
num = 0
## 함수 선언 부분 ##
def clickNext():
global num #num 변수는 next와 prev가 같이쓰려면 전역변수로 사용해야함.
num += 1
#if num > 8:
if num > (len(fnameList)-1):
num = 0
photo = PhotoImage(file = "gif/" + fnameList[num])
pLabel.configure(image = photo)
pLabel.image = photo
# 이전 버튼 클릭시 호출되는 함수 = '이벤트핸들러' 라고 함.(이벤트발생시 동작을 지정한 함수)
def clickPrev():
global num #num이라는 변수는 전역변수로 쓸거야 라고 선언을 해줌.(위에 있는 전역변수 num)
num -= 1
if num < 0:
#num = 8 # 인덱스의 마지막
num = len(fnameList)-1
photo = PhotoImage(file = "gif/"+fnameList[num])
pLabel.configure(image = photo)
pLabel.image = photo
## 메인 코드 부분 (초기화면)
window = Tk()
window.geometry("700x500")
window.title("사진 앨범 보기")
btnPrev = Button(window, text = "<<이전", command = clickPrev)
btnNext = Button(window, text = "다음>>", command = clickNext)
photo = PhotoImage(file = "gif/" + fnameList[0])
pLabel = Label(window, image = photo)
# window에 보여질 위치 지정(place 함수 사용)
btnPrev.place(x = 250, y = 10)##버튼들의 위치 place함수로, x y좌표 입력)
btnNext.place(x = 400, y = 10)
pLabel.place(x = 15, y = 50) ## 사진의 위치
window.mainloop()
3. gui _ 3
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 10 11:00:29 2021
@author: 2016005
guiex3.py: 파일열기를 통해서 이미지 선택하기
"""
from tkinter import *
from tkinter.filedialog import *
def func_open():
#askopenfilename은 tkinter.filedialog에 있음
#파일열기 창을 열기.askopenfilename // 나는 윈도우객체에 종속돼있고(parent=window)
# 파일 타입은 두 가지형태로 보여지게 돼있다. gif, 모든파일 ==> 튜플형태로 지정.
filename = askopenfilename(parent = window,
filetypes = (("GIF 파일","*.gif"),("모든 파일","*.*")))
photo = PhotoImage(file = filename) # 파일 선택한것으로 바꿔주고
pLabel.configure(image = photo) # plabel을 수정을 해줌.
pLabel.image = photo
def func_exit():
window.quit() #윈도우 객체를 보이지 않도록.
window.destroy() # 윈도우 객체를 제거. => 프로그램종료
window = Tk()
window.geometry("400x400")
window.title("GIF 이미지 선택하여 보기")
photo = PhotoImage() # 이미지 설정 안함.(이미지야 라고만 해놓고 설정은 안해놓음)
pLabel = Label(window, image = photo)
pLabel.pack(expand=1, anchor=CENTER)
mainMenu = Menu(window) # 메뉴를 윈도우에 넣을거야(메뉴바)
window.config(menu=mainMenu) #window에 menu를 설정하겠다. 그 메뉴는mainMenu야.
fileMenu = Menu(mainMenu) #fileMenu야. 를
mainMenu.add_cascade(label = "파일",menu = fileMenu) # 메인메뉴에 붙임. 카테고리 열라는 듯.
fileMenu.add_command(label = "파일 열기", command = func_open) #이걸 누르면 뭔가 해야돼. 라고 해서 command로 한 것.
fileMenu.add_separator() # 중간선 하나 설정
fileMenu.add_command(label = "프로그램 종료", command = func_exit)
window.mainloop()
4. gui _ 4
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 10 11:36:41 2021
@author: 2016005
guiex4.py : 섭씨를 화씨로 변경하는 gui환경 프로그램
"""
from tkinter import *
#화씨 = 섭씨*9/5+32
#섭씨 = (화씨-32)*5/9
def fa():
e2.delete(0,END)
c = float(e1.get()) ## 실수형으로 바꾸려면 float로 하면 된다.
f = c*9/5+32
e2.insert(0,round(f,2))
def ca():
e1.delete(0,END)
f = float(e2.get())
c = (f-32)*5/9
e1.insert(0,round(c,2))
window = Tk()
window.title("섭씨를 화씨로 변경")
window.geometry("500x200")
window.resizable(True, False)
l1 = Label(window,text="섭씨")
l2 = Label(window,text="화씨")
l1.pack()
l2.pack()
l1.place(x=100,y=0)
l2.place(x=100,y=20)
e1 = Entry(window) #Entry : 입력받는 것. get이라는 메서드로 값을 가져오고 insert로 값을 넣어줌.
e2 = Entry(window)
e1.pack() # 위치지정 pack
e2.pack()
b1 = Button(window,text="섭씨->화씨", command=fa)
b1.pack()
b2 = Button(window,text="화씨->섭씨", command=ca)
b2.pack()
window.mainloop()
5. gui _ 5
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 10 13:38:26 2021
@author: 2016005
guiex5.py : 간단한 계산기 만들기
모듈을사용할 때 어떻게 사용할지는우리가 결정해야한다
"""
import tkinter as tk
def calculate(event):
value=tk.Entry.get(display) #display라는 Entry로부터 값을 가져와.
if value != "":
result = eval(value) #자바스크립트와 같은 기능. eval(~~) : 문자열=>수식=>결과리턴
display.delete(0,tk.END) ##??????????tk는 도대체 뭘 참조하고있는 것인지?
display.insert(0,result)
def clear(event):
display.delete(0,tk.END)
window = tk.Tk()
#앞서 from tkinter import * 라고 했다. 지금은 다름.
#import tkinter as tk => tkinter모듈을 tk로 쓰겠다. tk.TK()이런식으로 쓰겠다.
# 임포트에 따라서 표현방식이 달라짐.
window.title("계산기")
window.geometry("300x300")
display = tk.Entry(window, width=20) # 입력하는 한 줄 에디터. 입력란 ==display
display.pack() #차근차근 붙여준다.
b1 = tk.Button(window, text="=", width=5)
b1.bind("<Button-1>", calculate) #button-1 에 있는 얘를 누르면 calculate함수를 호출
#bind : 이벤트 등록. <Button-1>로 이벤트 등록.
b1.pack()
b_c = tk.Button(window, text="C", width=5)
b_c.bind("<Button-1>", clear)
b_c.pack()
window.bind("<Return>",calculate)
window.bind("<Escape>",clear)
window.mainloop()
6. gui _ 6
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 10 13:59:12 2021
@author: 2016005
guiex6.py : gui환경 + DB내용 조회
"""
import sqlite3
from tkinter import *
from tkinter import messagebox
'''
insertData():
1)edit1~4의 값을 읽어서 db에 등록
2)성공/실패: 메시지를 messagebox로 표시(예외처리)
'''
def insertData():
'''
sqlite연결 순서
1) con=sqlite3.connect("db경로/이름")
2) cur=con.cursor()
3) cur.execute("쿼리문")
select경우
4) cur는 쿼리문결과를 담고있다. while~~row=cur.fetchone() / fetchall()로 뽑아쓴다.
insert경우
4)그냥 execute하면 끝.
'''
con=sqlite3.connect("iddb") #iddb가 있는 폴더 경로로.
#usertable 테이블이 존재하는 sqlite 데이터 베이스 파일을 설정
cur=con.cursor()
data = []
data.append(edit1.get())
data.append(edit2.get())
data.append(edit3.get())
data.append(edit4.get())
print(data)
try:
cur.execute("insert into usertable (id, username, email, birthyear) \
values('"+data[0]+"','"+data[1]+"','"+data[2]+"',"+data[3]+")")
con.commit()
except: #try구문에서 오류발생시 실행되는 블럭
messagebox.showerror("알림","등록실패")
else: #정상적인 경우만 실행되는 블럭
messagebox.showinfo("알림","등록성공")
finally: #정상이던 오류던 어쨋든 실행되는 블럭
cur.close()
con.close()
def selectData():
strData1, strData2, strData3, strData4 = [],[],[],[]
con=sqlite3.connect("iddb") #iddb가 있는 폴더 경로로.
#usertable 테이블이 존재하는 sqlite 데이터 베이스 파일을 설정
cur=con.cursor()
cur.execute("select * from usertable")
#각각의 리스트에 head부분
strData1.append("사용자ID"); strData2.append("사용자이름");
strData3.append("이메일"); strData4.append("출생년도");
strData1.append("--------"); strData2.append("--------");
strData3.append("--------"); strData4.append("--------");
while True: #각각의 리스트에 추가.
row = cur.fetchone() #레코드 한줄씩 읽기(레코드 전부 다 읽긴 함)
if(row == None):
break
strData1.append(row[0]) #사용자ID
strData2.append(row[1]) #사용자이름
strData3.append(row[2]) #이메일
strData4.append(row[3]) #출생년도
#ListBox의 기존내용을 제거(인덱스0 ~ 끝)
listData1.delete(0, listData1.size() -1 )
listData2.delete(0, listData2.size() -1 )
listData3.delete(0, listData3.size() -1 )
listData4.delete(0, listData4.size() -1 )
for item1, item2, item3, item4 in zip(strData1, strData2, strData3, strData4):
#ListBox칸의 마지막에 데이터를 추가하기.
listData1.insert(END, item1)
listData2.insert(END, item2)
listData3.insert(END, item3)
listData4.insert(END, item4)
"""
zip(strData1, strData2, strData3, strData4) => 같은크기의 리스트 들 결합
각각에서 한개씩을 가져와서 각각의 item으로 넣었다.
item1 : strData1의 한개의 요소 : 사용자ID
item2 : ""2
item3 : ""3
item4 : ""4
"""
con.commit()
con.close()
window = Tk()
window.geometry("1000x300")
window.title("GUI 데이터 입력")
edtFrame = Frame(window) # 윈도우 안에 새로운 창을 하나 띄운 것.그냥 한 프레임.
edtFrame.pack()
listFrame = Frame(window)# 얘도 마찬가지
listFrame.pack(side=BOTTOM, fill=BOTH, expand=1)
#-------
edit1 = Entry(edtFrame, width=10) #네개의 엔트리가 4개의 입력란
edit1.pack(side=LEFT, padx=10, pady=10)
edit2 = Entry(edtFrame, width=10)
edit2.pack(side=LEFT, padx=10, pady=10)
edit3 = Entry(edtFrame, width=10)
edit3.pack(side=LEFT, padx=10, pady=10)
edit4 = Entry(edtFrame, width=10)
edit4.pack(side=LEFT, padx=10, pady=10)
#-------
btnInsert = Button(edtFrame, text="입력", command=insertData) #버튼 edit1~4내용 등록-
btnInsert.pack(side=LEFT, padx=10, pady=10)
btnInsert = Button(edtFrame, text="조회", command=selectData) # DB로 부터 listData1~4로 넣어줌
btnInsert.pack(side=LEFT, padx=10, pady=10)
#--------
listData1 = Listbox(listFrame, bg="yellow")
listData1.pack(side=LEFT, fill=BOTH, expand=1)
listData2 = Listbox(listFrame, bg="yellow")
listData2.pack(side=LEFT, fill=BOTH, expand=1)
listData3 = Listbox(listFrame, bg="yellow")
listData3.pack(side=LEFT, fill=BOTH, expand=1)
listData4 = Listbox(listFrame, bg="yellow")
listData4.pack(side=LEFT, fill=BOTH, expand=1)
window.mainloop()
7. gui _ 7
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 10 15:57:43 2021
@author: 2016005
raw파일 : 2진 이미지파일(압축이 안된 상태)
순수하게 0과 1로만 구성돼있는 이미지 정보파일
하나하나 점을 찍어서 canvas를 만들어서 하나하나 점을 찍는 것.
=> 어디에 사용?
머신러닝--> 손글씨같은것 했을 때, 1인지2인지 기계학습을 해서 처리하는 것.
에 쓴다.
guiex7.py : raw파일을 이미지로 출력하기
"""
from tkinter import *
window = None
canvas = None
XSIZE, YSIZE = 256, 256
window=Tk()
window.title("raw 파일출력하기")
canvas = Canvas(window, height=YSIZE, width=XSIZE) # 그림 그릴 도화지
paper = PhotoImage(width=XSIZE, height=YSIZE) #비어있는 형태
canvas.create_image((XSIZE/2, YSIZE/2), image=paper, state="normal")
fp = open("flower.raw", "rb") #raw : 이미지파일을 날것(2진수)그대로 저장된 파일.
for i in range(0, XSIZE): #256
for k in range(0, YSIZE): #256
data = int(ord(fp.read(1))) #1바이트를 읽어냄(바이너리타입이기때문에) 아스키코드를 int로 바꿔서 가져옴.
##ord : (함수)아스키코드값.( ord('A') == 65 )
paper.put("#%02x%02x%02x" % (data, data, data), (k,i))
## 색상 표시 : #FFEEFF ==> 색깔 점을 k,i(좌표)에 찍어준다.
fp.close()
canvas.pack()
window.mainloop()
==============test============
1. test _ 1
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 10 16:33:17 2021
@author: 2016005
test1 : 간단한 계산기 만들기
"""
from tkinter import *
def ev(st):
print(st)
entry.insert(END, st)
'''
if st='r':
res = eval(st)
entry.delete(0,END)
entry.insert(0,eval(res))
elif st='AC':
entry.delete(0,END)
'''
def clear():
entry.delete(0,END)
def result():
res = entry.get()
entry.delete(0,END)
entry.insert(0,eval(res))
window = Tk()
window.title("간단한 계산기")
window.geometry("500x160")
window.resizable(True, True)
frame0 = Frame(window)
frame1 = Frame(window)
frame2 = Frame(window)
frame3 = Frame(window)
frame4 = Frame(window)
entry = Entry(frame0,width=76,bd=1, justify=RIGHT) #입력란 input type=text
entry.grid(row=0, columnspan=4) # 첫번째 행에 4개의 컬럼을 통틀어서 배치.
#entry는 위젯'이다. grid = 표 = 와꾸설정 속성
entry.pack(side='top')
#실행이 돼버리는 것이 문제인데, 람다를 붙여줘서 정의를 내리는.
#Button(~~~~~~,~~~,~~~,`~~,~~~) 으로 해도 됨.
b7 = Button(frame1,text="7",width=15,height=2,command = lambda:ev('7'));
b8 = Button(frame1,text="8",width=15,height=2,command = lambda:ev('8'));
b9 = Button(frame1,text="9",width=15,height=2,command = lambda:ev('9'));
div = Button(frame1,text="/",width=15,height=2,command = lambda:ev('/'));
b4 = Button(frame2,text="4",width=15,height=2,command=lambda:ev('4'))
b5 = Button(frame2,text="5",width=15,height=2,command=lambda:ev('5'))
b6 = Button(frame2,text="6",width=15,height=2,command=lambda:ev('6'))
mul = Button(frame2,text="*",width=15,height=2,command=lambda:ev('*'))
b1 = Button(frame3,text="1",width=15,height=2,command=lambda:ev("1"))
b2 = Button(frame3,text="2",width=15,height=2,command=lambda:ev("2"))
b3 = Button(frame3,text="3",width=15,height=2,command=lambda:ev("3"))
plu = Button(frame3,text="+",width=15,height=2,command=lambda:ev("+"))
ac = Button(frame4,text="AC",width=15,height=2,command=clear)
b0 = Button(frame4,text="0",width=15,height=2,command=lambda:ev("0"))
res = Button(frame4,text="=",width=15,height=2,command=result)
sub = Button(frame4,text="-",width=15,height=2,command=lambda:ev("-"))
#파이썬이 인터프리터 방식이기때문에 lambda로 해야하나?
frame0.pack();frame1.pack();frame2.pack();frame3.pack();frame4.pack();
b7.pack(side='left');
b8.pack(side='left');
b9.pack(side='left');
div.pack(side='left');
b4.pack(side='left');
b5.pack(side='left');
b6.pack(side='left');
mul.pack(side='left');
b1.pack(side='left');
b2.pack(side='left');
b3.pack(side='left');
plu.pack(side='left');
ac.pack(side='left');
b0.pack(side='left');
res.pack(side='left');
sub.pack(side='left');
window.mainloop()
2. test _ 2
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 10 22:33:09 2021
@author: 2016005
test2.py
동물 선택하여 대표 이미지 보기
"""
from tkinter import *
from tkinter import messagebox
def ok():
animal=["GIF/dog.gif", "GIF/cat.gif", "GIF/rabbit.gif"]
i=Radiovar.get() #IntVar()의 값을 가져옴
filename=animal[i]
photo = PhotoImage(file = filename) # 파일 선택한것으로 바꿔주고
pLabel.configure(image = photo) # plabel을 수정을 해줌.
pLabel.image = photo
window=Tk()
window.title("좋아하는 동물 선택하기")
window.geometry("500x500")
window.resizable(True, True)
label = Label(window,text="좋아하는 동물 투표",width=300, font=("궁서",30),fg="blue")
label.pack()
Radiovar = IntVar() #IntVar() :정수값을 저장할 value다.
#RadioButton에서의 variable은 value를 정수값으로 저장하게끔 한다.★
# variable : value값을 변수화.
rbtn1 = Radiobutton(window,text="강아지", variable=Radiovar, value=0,pady=10)
rbtn1.pack()
rbtn2 = Radiobutton(window,text="고양이",variable=Radiovar, value=1,pady=10)
rbtn2.pack()
rbtn3 = Radiobutton(window,text="토끼", variable=Radiovar, value=2,pady=10)
rbtn3.pack()
b1 = Button(window, text="사진보기", command=ok, width=10, height=2)
b1.pack()
photo = PhotoImage() # 이미지 설정 안함.(이미지야 라고만 해놓고 설정은 안해놓음)
pLabel = Label(window, image = photo, relief="solid",bd=10) #라벨만 잡아놓음
pLabel.pack(expand=1, anchor=CENTER)
window.mainloop()
반응형
'공부중 > python' 카테고리의 다른 글
파이썬 입문 7일차 (0) | 2021.02.18 |
---|---|
파이썬 입문 6일차 (0) | 2021.02.18 |
파이썬 입문 3일차 (0) | 2021.02.08 |
파이썬 입문 2일차 (0) | 2021.02.08 |
파이썬 입문 1일차 (0) | 2021.02.08 |