2017-11-26 5 views
0

레이블 위젯에 이미지를 삽입하려고합니다. show() 함수를 사용하면 이미지가 성공적으로로드됩니다. 어떤 이유로 이미지가 GUI에 표시되지 않습니다. 나는 앱의 전체 배경을 보여주기 위해 노력했지만, GUI의 나머지 부분으로 이동하는 방법을 파악하는 동안 한 프레임에 표시하는 것이 허용 될 수 있습니다. 다음은이 매우 일반적인 문제입니다 화면 출력 샷 코드이미지/레이블이 PIL/Python 3.6과 함께 표시되지 않음

https://i.imgur.com/6Z2qv8S.png

import sys 
from tkinter import * 
from PIL import Image,ImageTk 

class Game_Client(object): 

def __init__(self): 
    self.tk = Tk() 
    self.tk.title("Untitled Game") 
    self.tk.wm_state('zoomed') 

    # Create the frame holders 
    top_left = self.create_topleft() 
    top_mid = self.create_topmid() 
    top_right = self.create_topright() 
    btm_left = self.create_btmleft() 
    btm_mid = self.create_btmmid() 
    btm_right = self.create_btmright() 
    border_left = self.create_borderL() 
    border_right = self.create_borderR() 
    border_top = self.create_borderT() 
    border_bottom = self.create_borderB() 

    self.tk.grid_rowconfigure(0, weight=1) 
    self.tk.grid_rowconfigure(1, weight=4) 
    self.tk.grid_rowconfigure(2, weight=4) 
    self.tk.grid_rowconfigure(3, weight=1) 
    self.tk.grid_columnconfigure(0, weight=1) 
    self.tk.grid_columnconfigure(1, weight=4) 
    self.tk.grid_columnconfigure(2, weight=4) 
    self.tk.grid_columnconfigure(3, weight=4) 
    self.tk.grid_columnconfigure(4, weight=1) 

    background_image = Image.open('client-bg.jpg') 
    #background_image.show() 
    background_image = ImageTk.PhotoImage(background_image) 
    background_label = Label(top_mid, image=background_image) 
    #background_label.grid(row=0, column=0, rowspan=4, columnspan=5) 
    background_label.place(x=0,y=0,relheight=1, relwidth=1) 
    background_label.lift(aboveThis=None) 

    # Position the frames and set rescale weight 
    top_left.grid(row=0, column=0, sticky="nsew") 
    top_mid.grid(row=0, column=1, sticky="nsew") 
    top_right.grid(row=0, column=2, sticky="nsew") 
    btm_left.grid(row=1, column=0, sticky="nsew") 
    btm_mid.grid(row=1, column=1, sticky="nsew") 
    btm_right.grid(row=1, column=2, sticky="nsew") 
    border_left.grid(row = 0, column = 0, rowspan = 4, sticky="ns") 
    border_right.grid(row=0, column=4, rowspan=4, sticky="ns") 
    border_top.grid(row=0, column=0, columnspan=5, sticky="ew") 
    border_bottom.grid(row=4, column=0, columnspan=5, sticky="ew") 

    txtOutFrame = Frame(btm_mid, bg="purple", height=625, width=560) 
    txtOutFrame.pack(side=TOP, fill=BOTH) 
    txtOutFrame.pack_propagate(False) 
    txtOut = Text(txtOutFrame) 
    txtOut.config(bg='black', fg='green', relief="groove") 
    txtOut.pack(expand=True, fill=BOTH) 

    txtChatFrame = Frame(btm_mid, bg="pink", height=150, width=560) 
    txtChatFrame.pack(side=BOTTOM, fill=X) 
    txtChatFrame.pack_propagate(False) 
    txtChat = Text(txtChatFrame) 
    txtChat.config(bg='white', fg = 'black', relief="groove") 
    txtChat.pack(expand=True, fill=X) 

    self.state = False 
    self.tk.bind("<F11>", self.toggle_fullscreen) 
    self.tk.bind("<Escape>", self.end_fullscreen) 

def toggle_fullscreen(self, event=None): 
    self.state = not self.state # Just toggling the boolean 
    self.tk.attributes("-fullscreen", self.state) 
    return "break" 

def end_fullscreen(self, event=None): 
    self.state = False 
    self.tk.attributes("-fullscreen", False) 
    return "break" 

def create_topleft(layout): 
    f = Frame(layout.tk, bg='red', width=430, height=295) 
    return f 

def create_topmid(layout): 
    f = Frame(layout.tk, bg='orange', width=1050, height=295) 
    return f 

def create_topright(layout): 
    f = Frame(layout.tk, bg='purple', width=430, height=295) 
    return f 

def create_btmleft(layout): 
    f = Frame(layout.tk, bg='blue', width=430, height=775) 
    return f 

def create_btmmid(layout): 
    f = Frame(layout.tk, bg='yellow', width=1050, height=775) 
    return f 

def create_btmright(layout): 
    f = Frame(layout.tk, bg='green', width=430, height=775) 
    return f 

def create_borderL(layout): 
    f = Frame(layout.tk, bg='black', width=5, height=1080) 
    return f 

def create_borderR(layout): 
    f = Frame(layout.tk, bg='black', width=5, height=1080) 
    return f 

def create_borderT(layout): 
    f = Frame(layout.tk, bg='black', width=1920, height=5) 
    return f 

def create_borderB(layout): 
    f = Frame(layout.tk, bg='black', width=1920, height=5) 
    return f 

if __name__ == '__main__': 
    w = Game_Client() 
    w.tk.mainloop() 
+0

문제의 코드는 background_image입니다. –

+0

이것은 간단한 대답 이었지만 나중에 참조 할 수 있도록 일반적으로 마일 길이의 질문에 신경 쓰지 않습니다. 여기서 질문을하기 전에 [mcve]를 만드십시오. – Novel

답변

2

입니다 다음. PhotoImage 객체에 대한 참조를 유지해야합니다.

background_image = Image.open('client-bg.jpg') 
background_image = ImageTk.PhotoImage(background_image) 
background_label = Label(top_mid, image=background_image) 
background_label.image_ref = background_image # keep the reference! 

그렇지 않으면 이미지가 가비지 수집됩니다.