python PIL 和 tkinter;增亮图像并显示它

标签 python python-2.7 tkinter python-imaging-library

我想要做的是打开一个包含两张图片的窗口(一张图片是另一张图片的精确副本)。然后,当我单击一个按钮时,它会更改右侧的图像。我希望这是有道理的。我没有的代码是:

from __future__ import division
from Tkinter import *
from PIL import Image, ImageTk, ImageFilter
import random

class MyApp(object):
    def __init__(self):
        self.root = Tk()
        self.root.wm_title("Image examples")

        img = Image.open("lineage.jpg").convert("RGB")
        (w, h) = (img.size[0], img.size[1])
        print (w, h)

        tkpi = ImageTk.PhotoImage(img)
        label = Label(self.root, image=tkpi)
        label.grid(row=0, column=0, padx=5, pady=5, rowspan=10)

        img2 = img.copy()
        pixels = img2.load()

        tkpi2 = ImageTk.PhotoImage(img2)
        label = Label(self.root, image=tkpi2)
        label.grid(row=0, column=1, padx=5, pady=5, rowspan=10)

        Button(self.root, text="Brighten", command=self.brighten).grid(row=0, column= 2)  
        self.root.mainloop()

    def brighten(self):
        self.pixels = self.pixels.point(lambda x: x*1.9)          
MyApp()

我正在尝试的是在我单击 brighten 按钮时更新 img2。当我现在尝试时,出现此错误:

File "C:\Users\Admin\Desktop\imageeditor.py", line 36, in brighten
self.pixels = self.pixels.point(lambda x: x*1.9)
AttributeError: 'MyApp' object has no attribute 'pixels'

如您所知,我是编程新手,所以任何帮助我走上正轨的帮助都会很棒。

最佳答案

下面是一个完整的有效解决方案。以下是对所做更改的一些评论:

  • 以前 __init__ 方法从未返回,因为它在最后调用了 self.root.mainloop()。这可能会导致一些问题。我将其重组为更像 python 文档中的 hello world 示例。
  • 有一个很棒的Darken/Lighten Example这就是 brighten() 方法的原型(prototype)。
  • 有一个 from Tkinter import *,它被替换为 from Tkinter import Frame, Tk, Label, Button。事实证明,PIL 和 Tkinter 都有一个名为 Image 的属性,使用起来真的很困惑。尝试避免使用 from module import * 而是明确说明您要导入的内容,这将防止 namespace 冲突。

代码

from Tkinter import Frame, Tk, Label, Button
from PIL import Image, ImageTk, ImageFilter

class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        master.wm_title("Image examples")
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        self.img = Image.open("lineage.jpg")
        self.photo1 = ImageTk.PhotoImage(self.img.convert("RGB"))
        self.label1 = Label(self, image=self.photo1)
        self.label1.grid(row=0, column=0)

        self.photo2 = ImageTk.PhotoImage(self.img.convert("RGB"))
        self.label2 = Label(self, image=self.photo2)
        self.label2.grid(row=0, column=1)

        button = Button(self, text="Brighten", command=self.brighten)
        button.grid(row=0, column=2)

    def brighten(self):
        img2 = self.img.point(lambda p: p * 1.9)
        self.photo2 = ImageTk.PhotoImage(img2)
        self.label2 = Label(self, image=self.photo2)
        self.label2.grid(row=0, column=1)

root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()

关于 python PIL 和 tkinter;增亮图像并显示它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13324027/

相关文章:

python - 如何使用OpenCV-Python顺利检测焊接接头?

python - 如何将 __len__ 添加到数据类型定义中没有 __len__ 的对象?

python - 如何将多个阻塞 Python 生成器复用为一个?

Python tkinter 小部件在更改时调整大小

python - 如何在 matplotlib 中绘制任意多个子图?

python - 要列出的整数

python - 属性错误: '_Screen' object has no attribute 'mainloop'

python - Tkinter 和多线程

python - 使用类制作 Tkinter Gui

python - 如何将我的数据(包含 float )写入python中的txt文件