我目前正在尝试制作简单的图像查看器,您可以使用比例调整亮度,对比度,颜色和清晰度。我是用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()
答案 0 :(得分:0)
这是一个设计问题,而不是Python问题。你必须从你的帧和图像中去除比例(可能是“ScaleDrawer”类)和增强器,而Frame类应该有一个增强器列表和一个“ScaleDrawer”对象列表。
答案 1 :(得分:0)
您将两个包含刻度的帧放在同一位置 - 第0行,第0列。如果您希望它们并排显示,则需要将它们放在不同的列中,或使用{{ 1}}。
其次,在使用网格时,您应该使用粘性参数,以便窗口小部件展开以填充其容器。此外,您需要使用pack
和grid_rowconfigure
方法为至少一行和一列提供1(一)或更多的权重,以便您的GUI具有适当的调整大小行为。对于所有内容从左到右或从上到下的简单布局,grid_columnconfigure
需要少量代码。
第三,由于您希望两个滑块都影响同一图像,因此您不希望在每个类pack
和Enhance
中创建包含图像的标签。而是创建一个图像并将其放在一个标签中。因此,在最高级别,您可以创建三个小部件:标签,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()
类,并确保它完全按照您的意愿工作。然后,为第二个做同样的事情。