我对编程总体来说是新手。我制作了一个简单的工具,可以将图像转换为 WebP 格式。
from PIL import Image
from tkinter import Tk, PhotoImage
from tkinter import filedialog as fd
from tkinter.ttk import Label, Button
# Set up window and configure the sizes
window = Tk()
window.title('Webp Converter')
window.geometry('300x150')
window.eval('tk::PlaceWindow . center')
window.tk.call('tk', 'scaling', 1.5)
icon = PhotoImage(file="uhggg-16.png")
window.iconphoto(False, icon)
# Define functions
def uploadConvert():
filepath = fd.askopenfilename()
filename = filepath.split('.')[0]
image = Image.open(filepath)
image = image.convert('RGB')
if image.size[0] > 700 or image.size[1] > 700:
image.thumbnail(size=((700, 700)))
image.save(f'{filename}.webp', 'webp')
# Labels and fields
lbl = Label(window, text='Select your image to convert:')
lbl.grid(column=0, row=0, padx=20, pady=20)
btn_upload = Button(text='Upload and convert', command=uploadConvert)
btn_upload.grid(column=0, row=1)
window.mainloop()
这里一切正常。
我想添加一个功能,在 2 个输入字段中显示所选图像的尺寸(宽度 x 高度),您可以更改宽度和高度,宽度/高度比例保持不变,或者您可以保持原样并继续 webp 转换。 我知道我需要一个额外的按钮和 2 个输入字段来做到这一点。但我不知道具体该怎么做。
我尝试将 uploadConvert() 函数拆分为 2 个函数:upload() 和 Convert()。 upload() 打开图像并获取图像名称,convert(filename, image) 从 upload() 接收 2 个参数并转换图像。 upload()和convert()将绑定到2个单独的ttk按钮。
我遇到的第一个问题是,convert() 不会从 upload() 获取对象,而且我也不知道应该如何使用 ttk 按钮的“command=”将函数绑定到具有多个参数的按钮。
我还尝试添加 2 个条目作为宽度和高度显示/输入字段..
文件路径和文件名源自函数upload(),而函数convert()又将使用它们。因此,将这两个变量声明为全局变量,以便它们也可以在其他函数中使用。
但是只有当upload()在convert()之前执行时,convert()才能使用upload()的变量。从逻辑上讲,用户将上传文件,然后才会进行转换。所以,很自然的upload()就会被执行。所以这满足了 我们的要求。
但是如果用户单击转换按钮而不单击上传按钮,则会执行转换。但由于变量 filepath 和 filename 没有定义,它会给出名称错误。为了解决这个问题,我们使用“try.. except..”方法来处理错误。
通过导入messagebox模块,用户可以获得弹出消息。所以,它的编码如下:如果名称错误,将弹出消息框,要求用户先上传文件。
现在,由于上传和转换是两个不同的按钮,它们分别触发两个不同的函数,即 upload() 和 Convert(),因此我们无需担心将按钮与两个函数绑定。
由于您需要用户输入宽度和高度,因此可以使用 Entry 小部件添加这些内容。用户输入可以通过 Entry_widget.get() 接收。这里是width.get和height.get()。由于这些需要转换为整数,因此将是 int(width.get()) 和 int(height.get(())。
您未导入的 Entry 小部件。我也添加了那部分。
from PIL import Image
from tkinter import Tk, PhotoImage, Entry
from tkinter import filedialog as fd
from tkinter.ttk import Label, Button
from tkinter import messagebox as mb
# Define functions
def upload():
global filepath
global filename
filepath = fd.askopenfilename()
filename = filepath.split('.')[0]
def convert():
got_width = int(width.get())
got_height = int(height.get())
try:
image = Image.open(filepath)
image = image.convert('RGB')
if image.size[0] > got_width or image.size[1] > got_height:
image.thumbnail(size=((got_width, got_height)))
image.save(f'{filename}.webp', 'webp')
except NameError:
mb.showinfo('Upload File', 'Upload your file before converting')
# Set up window and configure the sizes
window = Tk()
window.title('Webp Converter')
window.geometry('300x450')
window.eval('tk::PlaceWindow . center')
window.tk.call('tk', 'scaling', 1.5)
icon = PhotoImage(file="uhggg-16.png")
window.iconphoto(False, icon)
# Labels and fields
wdth = Label(window, text='width:')
wdth.grid(column=0, row=1, padx=20, pady=20)
width = Entry(window)
width.grid(column=0, row=2, padx=20, pady=20)
hgt = Label(window, text='height:')
hgt.grid(column=0, row=3, padx=20, pady=20)
height=Entry(window)
height.grid(column=0, row=4, padx=20, pady=20)
lbl = Label(window, text='Select your image to convert:')
lbl.grid(column=0, row=5, padx=20, pady=20)
btn_upload = Button(text='Upload', command=upload)
btn_upload.grid(column=0, row=6)
btn_convert = Button(text='convert', command=convert)
btn_convert.grid(column=0, row=7)
window.mainloop()