2017-05-13 2 views
1

간단한 madlib 스타일 게임을 만들고 있는데 약간의 문제가 있습니다. 캔버스에 결과를 표시하고 표시 할 수 없습니다.tkinter 캔버스의 일부를 지우고 제출을 누를 때 표시되는 방법은 무엇입니까?

다음 코드는 이미지를 캔버스의 배경으로 배치합니다. 그런 다음 삽입 할 모든 단어에 대해 레이블과 입력 필드를 2 열에 배치합니다. 페이지 하단에 제출 버튼이 있습니다. 배경 이미지를 제외하고 모든 것을 지우는 방법을 알아낼 수 없으므로 사용자 단어가 삽입 된 상태에서 이야기를 표시 할 수 있습니다. 콜백()에 배치하면 배경을 지우고 그 밖의 모든 것을 유지합니다. 나는 반대를 원한다.

from tkinter import * 
from PIL import Image, ImageTk 

canvas_width = 360 
canvas_height = 525 
file = r"C:\Users\kraak\Desktop\PyCharm Community Edition 2017.1.2\borderedpaper.GIF" 
master = Tk() 
canvas = Canvas(master, width=canvas_width, height=canvas_height) 

old_img = PhotoImage(file=file) 
new_img = old_img.subsample(3, 3) 
canvas.create_image(-11, -10, anchor=NW, image=new_img) 
canvas.create_window(0, 0, height=1, width=1, anchor=NW) 
canvas.create_text(0, 0, text="Test") 

e1 = Entry(canvas) 
canvas.create_window(250, 60, window=e1, height=15, width=100) 
label = Label(text="Enter an adjective.") 
label.place(x=40, y=50) 
e1.focus_set() 

e2 = Entry(canvas) 
canvas.create_window(250, 85, window=e2, height=15, width=100) 
label = Label(text="Enter a nationality.") 
label.place(x=40, y=75) 
e2.focus_set() 


def callback(): 
    print("Pizza was invented by a " + (e1.get()) + " " + (e2.get())) 

def answer(): 
    button = Button(text="Submit.", command=callback) 
    button.place(x=150, y=460) 

answer() 
canvas.pack() 


mainloop() 
+0

[** 최소 ** 완전하고 검증 가능한 예] (http://stackoverflow.com/help/mcve)를 작성하십시오. 캔버스를 지우는 데 문제가있는 경우 예제에 12 개의 항목 위젯과 레이블이 필요하지 않습니다. –

+0

"취소"란 무엇을 의미합니까? 모든 위젯을 삭제 하시겠습니까? 아니면 간단히 입력 위젯 및/또는 레이블을 비워 두시겠습니까? –

+0

요청에 따라 본보기를 단축했습니다. 배경 이미지를 제외한 모든 위젯을 삭제하고 싶습니다. 모든 것이 삭제 된 후 사용자가 삽입 한 답변이 스토리와 함께 인쇄되기를 원합니다. –

답변

0

모든 위젯에는 위젯을 삭제하는 데 사용할 수있는 destroy 메소드가 있습니다. 콜백에서 당신은 단순히 모든 위젯이 방법을 호출 할 수 있습니다

def callback(): 
    e1.destroy() 
    e2.destroy() 
    ... 

을 특정 경우에, 당신은 당신이 그들에게 고유 한 이름을 제공해야합니다 모든 라벨을 삭제하려면. 또는이 작업을 더 쉽게 수행하려면 모든 위젯을 저장하고 목록을 반복 할 수 있습니다.

+0

나는 목록을 사용하는 것과 같은 일을하려고 생각했지만 목록을 파괴 할 수는 없다. –

+1

@MichaelPhillips : 그러나 목록의 요소를 반복하고 각 요소를 destroy() 메소드로 호출 할 수 있습니다. – martineau

1

브라이언 오클리 (Bryan Oakley)는 callback() 기능에서 모두 destroy()을 쉽게 만들 수 있도록 제거하려는 위젯의 ID를 저장할 수 있다고 제안했습니다. 코드 수정을 보여줍니다 - # ADDED 주석이있는 줄을 주목하십시오.

from tkinter import * 
from PIL import Image, ImageTk 

canvas_width = 360 
canvas_height = 525 
file = r"C:\Users\kraak\Desktop\PyCharm Community Edition 2017.1.2\borderedpaper.GIF" 
master = Tk() 
canvas = Canvas(master, width=canvas_width, height=canvas_height) 
canvas_entry_widgets = [] # ADDED 

old_img = PhotoImage(file=file) 
new_img = old_img.subsample(3, 3) 
canvas.create_image(-11, -10, anchor=NW, image=new_img) 
canvas.create_window(0, 0, height=1, width=1, anchor=NW) 
canvas.create_text(0, 0, text="Test") 

e1 = Entry(canvas) 
canvas.create_window(250, 60, window=e1, height=15, width=100) 
label = Label(text="Enter an adjective.") 
label.place(x=40, y=50) 
e1.focus_set() 
canvas_entry_widgets.append(e1) # ADDED 

e2 = Entry(canvas) 
canvas.create_window(250, 85, window=e2, height=15, width=100) 
label = Label(text="Enter a nationality.") 
label.place(x=40, y=75) 
e2.focus_set() 
canvas_entry_widgets.append(e2) # ADDED 

def callback(): 
    print("Pizza was invented by a " + (e1.get()) + " " + (e2.get())) 
    # destroy the canvas entry widgets and clear the list # ADDED 
    while canvas_entry_widgets:       # ADDED 
     widget = canvas_entry_widgets.pop()    # ADDED 
     widget.destroy()         # ADDED 

def answer(): 
    button = Button(text="Submit.", command=callback) 
    button.place(x=150, y=460) 

answer() 
canvas.pack() 

mainloop() 
관련 문제