강좌가 아니라 소스를 제공하는 글입니다.
프로그램 사용 예시)
A는 게임 쿠폰이 너무 많습니다. 이 쿠폰을 일일이 쓰는건 너무 헷갈리고 번거로운 일입니다. 이 때, A는 프로그램을 사용해서 쿠폰을 하나씩 복사를 할 수 있습니다. 복사된 쿠폰은 프로그램에서 지워집니다. (리스트는 FIFO구조이며 복사 후 deque되는 형태입니다.)
프로그램 화면)
소스 제공)
import tkinter as tk from tkinter.scrolledtext import ScrolledText # 복사 항목 카운팅 변수/ 누적 사이즈 변수 count=0 nsize=0 ''' 누적 사이즈로 표시하는 이유: 만일 (처리 개수/리스트 크기)라고 가정. 3개 중 한 개가 빠져서 1/3이라고 표시했는데 2개가 더 들어오면 list.size()가 4가 되니 1/4가 됨 이 때, 리스트 요소 개수도 4고 크기도 4인데 1개가 빠져 나갔다고 하면 혼동이 될 수 있음 고로, 1/3에서 2개가 더 들어와 1/5가 됐다라고 표현하면 혼동이 안 됨 그러므로 (처리 개수/누적 사이즈)로 표현함 P.s. 처리 개수와 누적 사이즈는 리스트가 텅 비게 되면 0으로 변경됨 ''' # text데이터 제거 def delete(): text.delete(1.0,'end') text.focus() # text데이터를 리스트로 만듬 (데이터가 널값이면 리스트에 추가 x) def flist(event): global nsize # 함수에서 전역변수 nsize를 사용 win.geometry("740x370") # 윈도우 사이즈부터 재조정 s=text.get(1.0,'end') sarray=s.split('\n') for i in sarray: if(i!=''): list.insert(tk.END,i) nsize+=1 cl.configure(text="복사 완료: "+str(count)+"/"+str(nsize)) # 리스트가 있는 도중에 엔터를 누르면 nsize가 변하므로 라벨도 다시 보임 # 첫 번째 항목을 복사 / 이후 삭제 def html(): global count # 함수에서 전역변수 count를 사용 global nsize # 함수에서 전역변수 nsize를 사용 # 리스트 크기가 1이상일 때만 진행 if(list.size()!=0): # 리스트 인덱스 0을 반환 (튜플로 반환됨) 이후 스트링형으로 저장 tp=list.get(0,0) s=tp[0] # 복사/ 라벨로 알림 / 삭제 win.clipboard_clear() win.clipboard_append(s) win.update() # now it stays on the clipboard after the window is closed list.delete(0) # 삭제했는데 리스트에 남은게 없을 때 / 아닐 때 if(list.size()==0): count=0 nsize=0 else: count=count+1 cl.configure(text="복사 완료: "+str(count)+"/"+str(nsize)) else: print("리스트가 비었음") #윈도우 생성 win=tk.Tk() win.title("Return String") win.geometry("710x370") # 윈도우 가운데 x=win.winfo_screenwidth()/2-300 y=win.winfo_screenheight()/2-160 win.wm_geometry("+%d+%d"%(x,y)) # 라벨 tk.Label(win,text="입력:",foreground='red',background="#EAEAEA").grid(row=0,column=0,padx=2) tk.Label(win,text="리스트:",foreground='red',background="#EAEAEA").grid(row=0,column=2,padx=2) cl=tk.Label(win,text="",foreground='blue',background="#EAEAEA") # 복사 완료 개수 알리는 라벨 cl.grid(row=1,column=2,padx=2) # 텍스트 text=ScrolledText(win,width=40) text.grid(row=0,column=1,padx=2) text.bind('<Return>',flist) # 스크롤 적용된 리스트 박스 scrollbar = tk.Scrollbar(win, orient="vertical") scrollbar.grid(row=0,column=4,sticky=tk.N+tk.S) list=tk.Listbox(win,width=40,height=20,yscrollcommand=scrollbar.set) list.grid(row=0,column=3,padx=2) scrollbar.config(command=list.yview) #스크롤바 리스트박스에 연결 # 버튼 delete=tk.Button(win,command=delete,text="텍스트 제거") delete.grid(row=1,column=1,pady=10) firstcopy=tk.Button(win,command=html,text="첫 번째 항목 복사") firstcopy.grid(row=1,column=3,pady=10) # 포커스 및 메인룹 text.focus() win.mainloop()
간단한 로직 설명)
< 엔터를 입력 시 >
엔터를 입력 시 Text위젯이 가지는 String을 split을 이용해서 ‘\n’로 분리 ->
분리되어 만들어진 튜플을 for문을 통해 Listbox위젯에 삽입 ->
< 복사 버튼을 클릭 시 >
‘첫 번째 항목 복사’를 클릭 시 리스트 인덱스0에 해당하는 데이터를 가져 옴 ->
데이터는 튜플 타입이고 요소는 한 개만 가지니 튜플의 인덱스0을 s변수에 넣음 ->
클립보드 메소드를 사용해서 s변수 데이터를 복사함 ->
Listbox 인덱스0을 삭제 (큐와 같은 구조이므로 요소들은 앞으로 한 칸씩 이동함)