Изображение tkinter PIL не отображается в классе - PullRequest
0 голосов
/ 03 октября 2018

Я не могу показать изображение в классе tkinter PIL.Изображение упаковано или размещено успешно, но оно не отображается.windowxp обои и мужское лицо не показаны.Я сделал сообщение, когда щелкнул по его лицу.Так что, если я нажму на местоположение, появится окно сообщения.Но картина не появляется.Просто местоположение :( Я использую Windows 64bit и Python 3.6 Я кореец. Я не фанат английского языка .... Пожалуйста, поймите меня. Пожалуйста, помогите мне

Это правильный дисплей: скриншот

from tkinter import *
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk

    ##함수
class Mainwindow(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        self.title("김상곤이 좋아하는 꿈꾸는 학과 과목 문제 맞추기♡")
        self.geometry("1600x900")
        self.resizable(width=FALSE, height=FALSE)


        wall = tk.PhotoImage(file="gif/bg.gif")
        labelwall = tk.Label(self, image = wall)
        labelwall.place(x=0, y=0)

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        def func_make():
            messagebox.showinfo("제작자", "김재온, 정성윤, 안예진, 이소유, 우연서")

        def func_exit():
            window.quit()
            window.destroy()

        mainMenu=Menu(self)
        fileMenu=Menu(mainMenu)
        self.config(menu=mainMenu)
        mainMenu.add_cascade(label="파일", menu=fileMenu)
        fileMenu.add_command(label="제작자", command=func_make)
        fileMenu.add_separator()
        fileMenu.add_command(label="종료", command=func_exit)

        self.frames={}
        for F in (MainPage, QuizPage):
            page_name=F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name]=frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("MainPage")

    def show_frame(self, page_name):

        frame = self.frames[page_name]
        frame.tkraise()

    def 국어():

        page == 1

    subject=['국어', '과학', '역사', '사회', '기술']  

#색이나 위치 숫자 설정

mint="#99FFFF"
subjectsize=30
subjectbutton=60

##위젯

class MainPage(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.controller=controller
        def clickksk(event):
                messagebox.showinfo("김상곤", "아주 좋아요^^")

        labeltitle=tk.Label(self, text=
                            """김상곤이 좋아하는 꿈꾸는
학과 과목 문제 맞추기♡""", font=("궁서체", 35), bg="#8DFD73")

        ksk=tk.PhotoImage(file="gif/ksk.gif")
        labelksk=tk.Label(self, image=ksk)                           

        labelksk.place(x=400-subjectbutton, y=200)
        labelksk.bind("<Button>", clickksk)
        labelhow=tk.Label(self, text="게임방법!                   ", font=("맑은 고딕", 30), bg="#FFE400")
        labelexplain=tk.Label(self, text=
        """원하는 과목을 택해 클릭한후,
        OX퀴즈를 풀면 됩니다^^
        난이도=중3""", font=("고딕체", 25), bg="#FFE400")   

        btKorean=tk.Button(self, text="국어", font=("양재블럭체", subjectsize), bg=mint,
                        command=lambda: controller.show_frame("QuizPage"))

        btScience=tk.Button(self, text="과학", font=("양재블럭체", subjectsize), bg=mint)
        btHistory=tk.Button(self, text="역사", font=("양재블럭체", subjectsize), bg=mint)
        btSocial=tk.Button(self, text="사회", font=("양재블럭체", subjectsize), bg=mint)
        bttech=tk.Button(self, text="기술", font=("양재블럭체", subjectsize), bg=mint)

        ##pack하는 장소(코드 순차대로)

        labeltitle.place(relx= 0.25, rely=0.02, relwidth=0.5)
        labelhow.place(x=610-subjectbutton, y=200, relwidth=0.3)
        labelexplain.place(x=610-subjectbutton, y=260, relwidth=0.3)

        btKorean.place(x=400-subjectbutton, y=600)
        btScience.place(x=600-subjectbutton, y=600)
        btHistory.place(x=800-subjectbutton, y=600)
        btSocial.place(x=1000-subjectbutton, y=600)
        bttech.place(x=1200-subjectbutton, y=600)

        btKorean.bind("<Button-1>")
        btScience.bind("<Button-1>")
        btHistory.bind("<Button-1>")
        btSocial.bind("<Button-1>")
        bttech.bind("<Button-1>")

class QuizPage(tk.Frame):
    def __init__(self, parent, controller):

        OB=PhotoImage(file="gif/OB.gif")
        XR=PhotoImage(file="gif/XR.gif")

        tk.Frame.__init__(self, parent)
        self.controller = controller
        buttonOB=Button(self, image=OB)
        buttonXR=Button(self, image=XR)

        buttonOB.place()
        buttonXR.place()         

if __name__ == "__main__":
    app = Mainwindow()
    app.mainloop()

1 Ответ

0 голосов
/ 03 октября 2018

Я думаю, что ваша основная проблема в том, что вы используете два подкласса фреймов и используете сетку для управления ими, но главное окно приложения не расширяет область сетки.Вам необходимо добавить следующее к MainWindow.__init__:

self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)

, чтобы ячейка (0,0) расширялась, чтобы заполнить все доступное пространство.Затем ваш текущий выбранный фрейм расширится в этот регион, так как он имеет sticky='NSWE', установленный в вызове метода grid.

Где вы определяете container, вы оба упаковываетесь и сетка.Вы должны использовать только один.Тем не менее, это выглядит как мертвый код.Возможно, вы намеревались поместить подклассы в этот контейнер за один раз.

Кроме того, вы не можете просто позвонить buttonXR.place(), вам нужно дать ему позицию.Например: buttonXR.place(x=1, y=1).

...