2017-12-26 30 views
0

사용자가 Treeview 위젯에서 항목을 선택할 때마다 캔버스 위젯에 .png를 표시하는 코드를 작성하고 있습니다. 코드를 실행하면 selectedItems 함수에 오류가 발생했을 때만 캔바스에 이미지가 표시됩니다. 지금까지는 오류 일 수는 있지만 오류가 발생하지 않는 한 이미지는 표시되지 않습니다. 시간 지연 삽입 시도하고 디버깅 도구를 사용하지만 여전히 왜 이런 일이 이해가되지 않습니다. 오류가 없으면 Treeview는 선택된 항목에 대한 색인을 계속 생성하지만 캔바스는 그림으로 업데이트되지 않습니다. 누군가 나를 교육시킬 수 있습니까?tkinter canvas가 오류로만 업데이트 됨

Traceback (most recent call last): 
    File "C:\Program Files\Python36\lib\tkinter\__init__.py", line 1699, in __call__ 
    return self.func(*args) 
    File ".\front_end_DataManager.py", line 21, in selectedItems 
    a= 'hello' + 7 
TypeError: must be str, not int 

나는 형식 오류 하나 알고 있어요 :

import tkinter as tk 
import tkinter.ttk as ttk 
from PIL import Image, ImageTk 

def selectedItems(event): 
    item = tree.selection() 
    item_iid = tree.selection()[0] 
    parent_iid= tree.parent(item_iid) 
    directory= r"..." 
    if tree.item(parent_iid, "text") != "": 
     imageFile= directory + tree.item(item_iid, "text") 
     image_o= Image.open(imageFile) 
     image_o.thumbnail([683, 384], Image.ANTIALIAS) 
     image1= ImageTk.PhotoImage(image_o) 
     canvas1.create_image((0, 0), anchor= "nw", image= image1) 
     a= 'hello' + 7 

tree.bind("<<TreeviewSelect>>", selectedItems) 

내가 얻을 오류입니다. 이미지를 표시하는 것은 의도적 인 일입니다. 나는 문제가 tkinter 기능을 호출하는 것 같아요. 어떤 아이디어?

+1

페이지 The Tkinter PhotoImage Class의 말에 항상 넣어 전체 오류 메시지 문제 (역 추적) (텍스트로하지 스크린 샷). 다른 유용한 정보가 있습니다. – furas

+1

최소한 _ 우리는 업로드 된 코드로 오류를 재현 할 수 있어야합니다. 내 추측으로는 결국 [이미지에 대한 전역 참조를 사용해야 할 시점] (https://stackoverflow.com/q/3359717/7032856)에 도달하게됩니다. – Nae

+1

질문 게시 에티켓에 대한 지침을 주셔서 감사합니다. 좀 더 간결하고 오류 메시지를 포함하도록 내 질문을 업데이트했습니다. –

답변

0

함수의 로컬 변수에 할당 된 메모리 이미지를 제거하는 tkinter의 버그에 문제가 있습니다. 그런 다음 표시하지 않습니다. 이를 전역 변수 나 클래스에 할당해야합니다.

코드에서 global을 참조하십시오. 이렇게하면 image1은 로컬 변수가 아닌 전역 변수가됩니다.

def selectedItems(event): 
    global image1 

    item = tree.selection() 
    item_iid = tree.selection()[0] 
    parent_iid = tree.parent(item_iid) 
    directory = r"..." 
    if tree.item(parent_iid, "text") != "": 
     imageFile = directory + tree.item(item_iid, "text") 
     image_o = Image.open(imageFile) 
     image_o.thumbnail([683, 384], Image.ANTIALIAS) 
     image1 = ImageTk.PhotoImage(image_o) 
     canvas1.create_image((0, 0), anchor= "nw", image= image1) 

는 "주"를 참조하십시오

+0

예. 그것은 그것을 완전히 해결했습니다. 이전에 링크 된 Tkinter PhotoImage 클래스를 검토하고 함수에서 반환 된 변수에 이미지를 저장했습니다. 그건 효과가 없었지만, 글로벌하게 만들면 완전히 해결됩니다. 고맙습니다. –

+0

'bind()'/'command ='/'after()'에 의해 할당 된 함수는 나중에'mainloop()'에 의해 실행되지만'mainloop()'는 리턴 된 값을 전역 변수에 할당하지 않습니다. 반환 된 값은 상관하지 않습니다. 그것은 그들을 엿 본다. – furas