【问题标题】:How to get two images on separate frames using Canvas in tkinter?如何在 tkinter 中使用 Canvas 在不同的帧上获取两个图像?
【发布时间】:2021-07-18 04:39:45
【问题描述】:

在下面的代码中,我尝试使用 Canvas 将两个图像放在两个单独的窗口框架上

PANEL_HEIGHT = 440
PANEL_WIDTH = 304
BKG_IMG = "./backgrounds/Wireframe- welcome screen – 1.png"
MANAGE_ACC_BKG_IMG = "./backgrounds/Wireframe- welcome screen – 1.png"

class window1:

    def __init__(self):
        self.panel = Tk()
        self.panel.geometry(f"{PANEL_WIDTH}x{PANEL_HEIGHT}")


        self.canvas = Canvas(self.panel,width=2*PANEL_WIDTH, height=2*PANEL_HEIGHT)
        canvas = self.canvas

        img = PhotoImage(file=BKG_IMG)
        canvas.create_image(PANEL_WIDTH,PANEL_HEIGHT,image=img)
        canvas.place(x=-(PANEL_WIDTH/2),y=-(PANEL_HEIGHT/2))

class window2:

    def __init__(self):
        self.panel = Tk()
        self.panel.geometry(f"{PANEL_WIDTH}x{PANEL_HEIGHT}")


        self.canvas = Canvas(self.panel, width=2 * PANEL_WIDTH, height=2 * PANEL_HEIGHT)
        canvas = self.canvas
        img = PhotoImage(file=MANAGE_ACC_BKG_IMG)
        canvas.create_image(PANEL_WIDTH, PANEL_HEIGHT, image=img)
        canvas.place(x=-(PANEL_WIDTH / 2), y=-(PANEL_HEIGHT / 2))

window1()
window2()

在调用这两个类时,我收到“图像 'pyimage2' 不存在”错误

两个文件的绝对路径是

D:\pyAut\pythonBootCamp\backgrounds\manage_acc_ui_bkg.png D:\pyAut\pythonBootCamp\main.py

谁能告诉我如何完成任务????

【问题讨论】:

标签: python user-interface tkinter background-image tkinter-canvas


【解决方案1】:

您已经创建了两次 Tk():self.panel = Tk() 避免这种情况。 将self.panel = Tk()移到外面分享:panel = Tk()。

请试一试:

from tkinter import *  

PANEL_HEIGHT = 440
PANEL_WIDTH = 304
BKG_IMG = "./backgrounds/Wireframe- welcome screen – 1.png"
MANAGE_ACC_BKG_IMG = "./backgrounds/Wireframe- welcome screen – 1.png"

panel = Tk()
panel.geometry(f"{PANEL_WIDTH}x{PANEL_HEIGHT}")

class window1:

    def __init__(self):
        self.canvas = Canvas(panel,width=2*PANEL_WIDTH, height=2*PANEL_HEIGHT)
        canvas = self.canvas

        img = PhotoImage(file=BKG_IMG)
        canvas.create_image(PANEL_WIDTH,PANEL_HEIGHT,image=img)
        canvas.place(x=-(PANEL_WIDTH/2),y=-(PANEL_HEIGHT/2))

class window2:

    def __init__(self):
        self.canvas = Canvas(panel, width=2 * PANEL_WIDTH, height=2 * PANEL_HEIGHT)
        canvas = self.canvas
        img = PhotoImage(file=MANAGE_ACC_BKG_IMG)
        canvas.create_image(PANEL_WIDTH, PANEL_HEIGHT, image=img)
        canvas.place(x=-(PANEL_WIDTH / 2), y=-(PANEL_HEIGHT / 2))

window1()
window2()

【讨论】:

  • 不,当我取消第一个窗口时,这会破坏 Tk() 应用程序,并给出错误
【解决方案2】:

希望您对所提供的信息感到满意

import tkinter as tk
from PIL import ImageTk, Image

PANEL_HEIGHT = 440
PANEL_WIDTH = 304

main = tk.Tk()

BKG_IMG = "./backgrounds/Wireframe- welcome screen – 1.png"
MANAGE_ACC_BKG_IMG = "./backgrounds/Wireframe- welcome screen – 1.png"


class window1:
    window = tk.Toplevel(main)
    window.geometry(f"{PANEL_WIDTH}x{PANEL_HEIGHT}")
    window.title("Window 1")
    img = ImageTk.PhotoImage(Image.open(BKG_IMG))
    canvas = tk.Canvas(window, width=PANEL_WIDTH, height=PANEL_HEIGHT, background="white")
    canvas.pack()
    canvas.create_image(PANEL_WIDTH, PANEL_HEIGHT, image=img)


class window2:
    main.title("Window 2")
    main.geometry(f"{PANEL_WIDTH}x{PANEL_HEIGHT}")

    img = ImageTk.PhotoImage(Image.open(MANAGE_ACC_BKG_IMG))
    canvas = tk.Canvas(main, width=PANEL_WIDTH, height=PANEL_HEIGHT, background="white")
    canvas.pack()
    canvas.create_image(PANEL_WIDTH, PANEL_HEIGHT, image=img)


window1()
window2()

main.mainloop()

【讨论】:

    【解决方案3】:

    首先tkinterPhotoImage不支持.png格式,它只支持gif,ppm/pgm格式。
    如果要使用.png 格式,则需要使用 PIL 库。
    然后我认为在您的 window1window2 实例关闭后,您的图像完全被浪费了。
    因此,您需要在 img 之前添加self
    另外,您拨打Tk() 两次,这是一个问题。
    最后,您在两个类中都使用了相似的名称,这不好。
    因此,在完成所有编辑后,您的代码将如下所示。

    from PIL import ImageTk
    PANEL_HEIGHT = 440
    PANEL_WIDTH = 304
    BKG_IMG = "./backgrounds/Wireframe- welcome screen – 1.png"
    MANAGE_ACC_BKG_IMG = "./backgrounds/Wireframe- welcome screen – 1.png"
    
    panel = Tk()
    panel.geometry(f"{PANEL_WIDTH}x{PANEL_HEIGHT}")
    
    class window1:
    
        def __init__(self):
            self.canvas = Canvas(panel,width=2*PANEL_WIDTH, height=2*PANEL_HEIGHT)
            canvas = self.canvas
    
            self.img = ImageTk.PhotoImage(file=BKG_IMG)
            canvas.create_image(PANEL_WIDTH,PANEL_HEIGHT,image=self.img)
            canvas.place(x=-(PANEL_WIDTH/2),y=-(PANEL_HEIGHT/2))
    
    class window2:
    
        def __init__(self):
            self.canvas1 = Canvas(panel, width=2 * PANEL_WIDTH, height=2 * PANEL_HEIGHT)
            canvas1 = self.canvas1
            self.img1 = ImageTk.PhotoImage(file=MANAGE_ACC_BKG_IMG)
            canvas1.create_image(PANEL_WIDTH, PANEL_HEIGHT, image=self.img1)
            canvas1.place(x=-(PANEL_WIDTH / 2), y=-(PANEL_HEIGHT / 2))
    
    window1()
    window2()
    panel.mainloop
    

    让我知道它是否有效。

    【讨论】:

    • 虽然我解决了我的问题,但我总是使用 png 格式,它适用于 PhotoImage
    • 我认为上面的链接已经失效了我不知道canvascreate_image 方法所以我在谷歌上搜索并找到了这个并在此基础上给出了答案,但我测试了自己也在 pycharm 上编码。我也想知道你是怎么解决你的问题的
    • 通过使用 Toplevel() 和 frame 而不是一次又一次地调用 Tk()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2016-07-03
    • 2020-01-01
    • 1970-01-01
    • 2021-03-08
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多