简体   繁体   English

Tkinter,并排显示两个图像

[英]Tkinter, Display Two Images Side-By-Side

I am trying to have two BMP images displayed side by side using Tkinter. 我正在尝试使用Tkinter并排显示两个BMP图像。 Once the second image is opened, the first image should reposition itself to the left, and the second image position itself to the right. 打开第二个图像后,第一个图像应将其自身重新定位在左侧,第二个图像将其自身重新定位在右侧。 When I try to do this, the other image goes missing or is replaced. 当我尝试执行此操作时,其他图像丢失或被替换。 How would I go about doing this? 我将如何去做呢? Also, my screen monitor is 1920 x 1080, so image resizing may vary. 另外,我的屏幕监视器为1920 x 1080,因此图像大小可能会有所不同。

Here is my code: 这是我的代码:

import tkinter as tk
from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk
import os

class Window(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)

        self.pos = []
        self.master.title("BMP Image GUI")
        self.pack(fill=BOTH, expand=1)

        menu = Menu(self.master)
        self.master.config(menu=menu)

        # File Bar
        file = Menu(menu)
        file.add_command(label="Open Image 1", command=self.openImage1)
        file.add_command(label="Open Image 2", command=self.openImage2)
        menu.add_cascade(label="File", menu=file)

        self.canvas = tk.Canvas(self)
        self.canvas.pack(fill=tk.BOTH, expand=True)
        self.image = None  
        self.image2 = None  

    #Image 1
    def openImage1(self):
        filename = filedialog.askopenfilename(initialdir=os.getcwd(),title="Select BMP File",
                                              filetypes=[("BMP Files","*.bmp")])
        if not filename:
            return 
        load = Image.open(filename)
        load = load.resize((960, 720), Image.ANTIALIAS)

        if self.image is None: 
            w, h = load.size
            width, height = root.winfo_screenmmwidth(), root.winfo_screenheight()
            self.render = ImageTk.PhotoImage(load)  
            self.image = self.canvas.create_image((w / 2, h / 2), image=self.render)
            root.geometry("%dx%d" % (w, h))
        else:
            w, h = load.size
            width, height = root.winfo_screenmmwidth(), root.winfo_screenheight()
            root.geometry("%dx%d" % (width, height))
            self.canvas.move(self.image, 960, 0)
            self.render = ImageTk.PhotoImage(load) 
            self.image2 = self.canvas.create_image((w / 2, h / 2), image=self.render)

    # Image 2
    def openImage2(self):
        filename = filedialog.askopenfilename(initialdir=os.getcwd(), title="Select BMP File",
                                              filetypes=[("BMP Files", "*.bmp")])
        if not filename:
            return 
        load = Image.open(filename)
        load = load.resize((960, 720), Image.ANTIALIAS)

        if self.image is None:  
            w, h = load.size
            self.render = ImageTk.PhotoImage(load)  
            self.image = self.canvas.create_image((w / 2, h / 2), image=self.render)
            root.geometry("%dx%d" % (w, h))
        else:
            w, h = load.size
            width, height = root.winfo_screenmmwidth(), root.winfo_screenheight()
            root.geometry("%dx%d" % (width, height))
            self.render = ImageTk.PhotoImage(load)  
            self.image2 = self.canvas.create_image((w / 2, h / 2), image=self.render)
            self.canvas.move(self.image2, 960, 0)

root = tk.Tk()
root.geometry("%dx%d" % (300, 300))
root.title("BMP Image GUI")
app = Window(root)
app.pack(fill=tk.BOTH, expand=1)
root.mainloop()

You are using "self.render" for both image objects. 您正在为两个图像对象使用“ self.render”。 So when you make one the other gets garbage collected. 因此,当您制造一个时,另一个会被垃圾收集。 Use unique names. 使用唯一的名称。

self.render1 = ImageTk.PhotoImage(load) 
self.image1 = self.canvas.create_image((w / 2, h / 2), image=self.render1)

Just figured it out! 只是想通了! Just had to create a new render in my second else statements. 只需在我的else语句中创建一个新的render Labeled as render2 标记为render2

import tkinter as tk
from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk
import os

class Window(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)

        self.master = master
        self.pos = []
        self.master.title("BMP Image GUI")
        self.pack(fill=BOTH, expand=1)

        menu = Menu(self.master)
        self.master.config(menu=menu)

        # File Bar
        file = Menu(menu)
        file.add_command(label="Open Image 1", command=self.openImage1)
        file.add_command(label="Open Image 2", command=self.openImage2)
        menu.add_cascade(label="File", menu=file)

        self.canvas = tk.Canvas(self)
        self.canvas.pack(fill=tk.BOTH, expand=True)
        self.image = None
        self.image2 = None

    def openImage1(self):
        filename = filedialog.askopenfilename(initialdir=os.getcwd(),title="Select BMP File",
                                              filetypes=[("BMP Files","*.bmp")])
        if not filename:
            return
        load = Image.open(filename)
        load = load.resize((960, 720), Image.ANTIALIAS)

        if self.image is None:
            w, h = load.size
            width, height = root.winfo_screenmmwidth(), root.winfo_screenheight()
            self.render = ImageTk.PhotoImage(load)
            self.image = self.canvas.create_image((w / 2, h / 2), image=self.render)
            root.geometry("%dx%d" % (w, h))
        else:
            w, h = load.size
            width, height = root.winfo_screenmmwidth(), root.winfo_screenheight()
            root.geometry("%dx%d" % (width, height))
            self.canvas.move(self.image, 960, 0)
            self.render2 = ImageTk.PhotoImage(load)
            self.image2 = self.canvas.create_image((w / 2, h / 2), image=self.render2)

    def openImage2(self):
        filename = filedialog.askopenfilename(initialdir=os.getcwd(), title="Select BMP File",
                                              filetypes=[("BMP Files", "*.bmp")])
        if not filename:
            return
        load = Image.open(filename)
        load = load.resize((960, 720), Image.ANTIALIAS)

        if self.image is None:
            w, h = load.size
            self.render = ImageTk.PhotoImage(load)
            self.image = self.canvas.create_image((w / 2, h / 2), image=self.render)
            root.geometry("%dx%d" % (w, h))
        else:
            w, h = load.size
            width, height = root.winfo_screenmmwidth(), root.winfo_screenheight()
            root.geometry("%dx%d" % (width, height))
            self.render2 = ImageTk.PhotoImage(load)
            self.image2 = self.canvas.create_image((w / 2, h / 2), image=self.render2)
            self.canvas.move(self.image2, 960, 0)

root = tk.Tk()
root.geometry("%dx%d" % (300, 300))
root.title("BMP Image GUI")
app = Window(root)
app.pack(fill=tk.BOTH, expand=1)
root.mainloop()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM