1

私がやりたいのは、2つの画像でウィンドウを開くことです(一方の画像はもう一方の画像の正確なコピーです)。次に、ボタンをクリックすると、右側の画像が変わります。これが理にかなっていることを願っています。私が持っていないコードは次のとおりです。

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

私がしようとしているのは、ボタンimg2をクリックしたときに更新されることbrightenです。今試してみると、次のエラーが発生します。

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'

あなたが言うことができるように、私はプログラミングに不慣れなので、正しい軌道に私を送るためのどんな助けも素晴らしいでしょう。

4

2 に答える 2

2

私は働くものを手に入れました。

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")
        (self.w, self.h) = (img.size[0], img.size[1])

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

        self.img2 = img.copy()
        self.pixels = self.img2.load()
        self.width, self.height = self.img2.size



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

        self.btn = Button(self.root, text="Brighten")
        self.btn.grid(row=0, column= 2)
        self.btn.bind('<Button-1>', self.brighten)
        self.root.mainloop()

    def brighten(self,*args):
#        self.pixels = self.pixels.point(lambda x: x*1.9)
        for i in range(self.w):    # for every pixel:
            for j in range(self.h):
#                print self.pixels[i,j]
                self.pixels[i,j] = (int(self.pixels[i,j][0] * 1.9),
                                    int(self.pixels[i,j][1] * 1.9),
                                    int(self.pixels[i,j][2] * 1.9))
        self.tkpi2 = ImageTk.PhotoImage(self.img2)
        self.label2.configure(image = self.tkpi2)
        self.root.update_idletasks()
MyApp()
于 2012-11-10T18:16:12.600 に答える
2

以下は、機能する完全なソリューションです。これらは、行われた変更に関するいくつかのコメントです。

  • 以前は__init__、最後に self.root.mainloop() を呼び出すため、メソッドは返されませんでした。これはいくつかの問題を引き起こす可能性があります。python docs の hello world の例のようになるように再構築しました。
  • メソッドがモデル化されている優れたDarken/Lighten Exampleがあります。brighten()
  • がありfrom Tkinter import *、これは に置き換えられましたfrom Tkinter import Frame, Tk, Label, Button。PIL と Tkinter の両方に という属性があり、Imageこれを扱うのが本当に混乱していたことがわかりました。の使用を避け、from module import *代わりに何をインポートするかを明示することで、名前空間の衝突を防ぐことができます。

コード

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()
于 2012-11-10T17:29:59.087 に答える