重新运行函数值更改的部分代码

Rerun part of code on function value change

我目前正在尝试创建一个程序,允许用户查看用户选择的衬衫与不同裤子的图片。

该程序包含一个目录,里面装满了衬衫的图片,还有一条裤子。 用户从下拉菜单中选择一件衬衫,然后程序生成、保存并显示使用该衬衫创建的所有可能组合。 为此,我使用了 Tkinter & PIL (Pillow)。

这是我的问题: 当用户编辑下拉菜单并选择另一件衬衫时,我想要使用那件衬衫生成新图像并替换当前显示的旧图像的程序。

我看过类似问题的答案,有些人建议 settergetter,当变量的值改变时检测并调用函数。我不太确定我是否理解它是如何工作的,而且绝对不知道如何将它实现到我的代码中。我要调用的函数在嵌套循环中。这在这种情况下有什么不同吗?

这是代码。 generateImage()函数是实际生成图像的多行代码的占位符。

为了检测从下拉菜单中选择的选项何时更改,我使用 variable.trace

shirtcolors = ["blue", "red", "green"]

def ChosenImage(*args):
        chosen_image = variable.get()
        print("value is: " + chosen_image)
        selectedimage = ""

        if chosen_image == "blue":
            selectedimage = "C:/User/Desktop/OutfitGenerator/shirts/IMG_0840.jpg"
        elif chosen_image == "red": 
            selectedimage = "C:/User/Desktop/OutfitGenerator/shirts/IMG_0850.jpg"
        elif chosen_image == "green":
            selectedimage = "C:/User/Desktop/OutfitGenerator/shirts/IMG_0860.jpg"

            return selectedimage

DropdownList = tk.OptionMenu(frame, variable, *shirtcolors)
DropdownList.pack()

variable.trace("w", callback=ChosenImage)

shirtslist = [ChosenImage()]
pantsdirectory= "C:/User/Desktop/OutfitGenerator/pants"
pantslist = [os.path.abspath(os.path.join(pantsdirecotry, h)) for h in os.listdir(pantsdirecotry)]

for i in shirtslist:
    for j in pantslist:
        def generateImage(file1, file2):

我的问题是我不知道如何再次使程序 运行 成为 variable.trace 行下方的代码。当回调发送到 ChosenImage 时,我希望它也继续其余代码,现在使用新的 selectedimage 值。但是,在回调到达 ChosenImage 函数并且它已更改其值之前,代码不会继续。

My problem is that i can't figure out how to make the program run the code below the variable.trace line again. When a callback is sent to ChosenImage I want it to also continue the rest of the code, now using the new selectedimage value.

这是错误的思路。你的回调 应该生成 combinations/images 的东西 - 你的回调不应该 return 任何东西,它应该只有副作用:

import tkinter as tk


class Application(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title("Window")
        self.geometry("256x64")
        self.resizable(width=False, height=False)

        self.shirt_colors = ["blue", "red", "green"]
        self.pants_colors = ["brown", "black"]

        self.drop_down_var = tk.StringVar(self)
        self.menu = tk.OptionMenu(self, self.drop_down_var, *self.shirt_colors)
        self.menu.pack()

        self.drop_down_var.trace("w", callback=self.on_change)

    def on_change(self, *args):
        # Everytime the selection changes, generate combinations
        shirt_color = self.drop_down_var.get()
        for pant_color in self.pants_colors:
            print("{} shirt with {} pants".format(shirt_color, pant_color))


def main():
    Application().mainloop()
    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())