Python 如何使用另一个函数的值并将该函数绑定到 Tkinter 按钮?

问题描述 投票:0回答:1

我对编程总体来说是新手。我制作了一个简单的工具,可以将图像转换为 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 个条目作为宽度和高度显示/输入字段..

python tkinter tkinter-entry ttkwidgets
1个回答
0
投票

文件路径和文件名源自函数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()
© www.soinside.com 2019 - 2024. All rights reserved.