python / tkinter - 图像查看器应用程序

时间:2014-01-03 11:36:53

标签: python tkinter

我目前正在尝试制作简单的图像查看器,您可以使用比例调整亮度,对比度,颜色和清晰度。我是用tkinter和PIL做的。到目前为止,我有两个类,一个用于亮度,另一个用于锐度,我只是找不到一种方法(我是初学者)在一个窗口和一个图片中绘制两个比例,可以通过这个比例进行修改。我所能做的只是绘制尺度,两张照片,每张照片都修改了自己的照片。 发送代码:

from tkinter import *
from PIL import Image, ImageTk, ImageEnhance


class Enhance(Frame):
    def __init__(self, master, image, name, enhancer, lo, hi):
       Frame.__init__(self, master)
       self.tkim = ImageTk.PhotoImage(image.mode, image.size)
       self.enhancer = enhancer(image)
       self.update("1.0")
       w = Label(self, image=self.tkim)
       w.grid(row = 0, column = 0, padx = 0, pady = 0)
       s = Scale(self, label=name, orient=VERTICAL,from_=hi, to=lo, resolution=0.01,command=self.update)
       s.set(self.value)
       s.grid(row = 1, column = 1, padx = 0, pady = 0) 

def update(self, value):
    self.value = eval(value)
    self.tkim.paste(self.enhancer.enhance(self.value))


class Enhance1(Frame):
   def __init__(self, master, image, name, enhancer, lo, hi):
       Frame.__init__(self, master)
       self.tkim = ImageTk.PhotoImage(image.mode, image.size)
       self.enhancer = enhancer(image)
       self.update("1.0")
       w = Label(self, image=self.tkim).grid(row = 0, column = 0, padx = 0, pady = 0)
       s = Scale(self, label=name, orient=VERTICAL,from_=hi, to=lo, resolution=0.01,command=self.update)
       s.set(self.value)
       s.grid(row = 0, column = 1, padx = 0, pady = 0)

def update(self, value):
    self.value = eval(value)
    self.tkim.paste(self.enhancer.enhance(self.value))


root = Tk()

im = Image.open("plant.jpg")   #choose your image

Enhance(root, im, "Brightness", ImageEnhance.Brightness, 0.0, 3.0).grid(row = 0, column = 0, padx = 0, pady = 0)
Enhance1(root, im, "Sharpness", ImageEnhance.Sharpness, -1.0, 5.0).grid(row = 0, column = 0, padx = 0, pady = 0)

root.mainloop()

2 个答案:

答案 0 :(得分:0)

这是一个设计问题,而不是Python问题。你必须从你的帧和图像中去除比例(可能是“ScaleDrawer”类)和增强器,而Frame类应该有一个增强器列表和一个“ScaleDrawer”对象列表。

答案 1 :(得分:0)

您将两个包含刻度的帧放在同一位置 - 第0行,第0列。如果您希望它们并排显示,则需要将它们放在不同的列中,或使用{{ 1}}。

其次,在使用网格时,您应该使用粘性参数,以便窗口小部件展开以填充其容器。此外,您需要使用packgrid_rowconfigure方法为至少一行和一列提供1(一)或更多的权重,以便您的GUI具有适当的调整大小行为。对于所有内容从左到右或从上到下的简单布局,grid_columnconfigure需要少量代码。

第三,由于您希望两个滑块都影响同一图像,因此您不希望在每个类packEnhance中创建包含图像的标签。而是创建一个图像并将其放在一个标签中。因此,在最高级别,您可以创建三个小部件:标签,Enhance1的实例和Enhance的实例。

最后,您似乎有缩进错误。方法Enhance1没有缩进,因此它不是类定义的一部分。此外,由于此方法是继承Frame的类的一部分,因此不应调用此方法update,因为这是所有tkinter小部件的内置方法。

我的建议是重新开始,而不是尝试修复你拥有的东西。从空白的石板开始,首先尝试使基本布局工作,然后再担心滑块。这可以让你专注于一件事,而不是试图让一切都工作。

例如,从这样的事情开始,以获得程序的基本结构(注意我没有进行全局导入,并且我也将主程序设为一个类,以帮助减少对全局变量的需求) 。

update

注意在调整窗口大小时区域是如何正确调整大小的。一旦我们开始工作,我们就可以向内部框架添加小部件,而不必担心它们如何影响主要布局。

有了这个,你现在有了建立GUI的良好基础。首先充实其中一个import Tkinter as tk class ImageViewer(tk.Frame): def __init__(self, master): tk.Frame.__init__(self, master, background="green") # for now, don't use images. This, so that we can get # the basic structure working self.im = None self.tkim = None # these three widgets make up our main layout label = tk.Label(self, image=self.tkim, text="label") e = Enhance(self, self.im) e1 = Enhance1(self, self.im) # grid works as well as pack in this case, but requires a # little more code. For that reason I prefer pack for very # simple layouts such as this. label.pack(side="bottom", fill="both", expand=True) e.pack(side="left", fill="both", expand=True) e1.pack(side="right", fill="both", expand=True) class Enhance(tk.Frame): def __init__(self, master, image): # we will be operating on this image, so save a # reference to it self.image = image # width, height, and color are only temporary, they # make it easy to see the frames before they have # any content self.image = image tk.Frame.__init__(self, master, background="bisque", width=100, height=100) class Enhance1(tk.Frame): def __init__(self, master, image): # we will be operating on this image, so save a # reference to it self.image = image # width, height, and color are only temporary, they # make it easy to see the frames before they have # any content tk.Frame.__init__(self, master, background="blue", width=100, height=100) if __name__ == "__main__": root = tk.Tk() ImageViewer(root).pack(fill="both", expand=True) root.mainloop() 类,并确保它完全按照您的意愿工作。然后,为第二个做同样的事情。