簡體   English   中英

Tkinter,並排顯示兩個圖像

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

我正在嘗試使用Tkinter並排顯示兩個BMP圖像。 打開第二個圖像后,第一個圖像應將其自身重新定位在左側,第二個圖像將其自身重新定位在右側。 當我嘗試執行此操作時,其他圖像丟失或被替換。 我將如何去做呢? 另外,我的屏幕監視器為1920 x 1080,因此圖像大小可能會有所不同。

這是我的代碼:

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()

您正在為兩個圖像對象使用“ self.render”。 因此,當您制造一個時,另一個會被垃圾收集。 使用唯一的名稱。

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

只是想通了! 只需在我的else語句中創建一個新的render 標記為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