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

lhcgjxsq  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(376)

我目前正在尝试创建一个程序,允许用户查看用户选择的衬衫与不同裤子组合的图片。
这个程序包含一个目录,里面有衬衫和裤子的图片。用户从下拉菜单中选择衬衫,然后程序生成、保存并显示使用衬衫创建的所有可能组合。为了实现这一点,我使用了tkinter&pil(枕头)。
我的问题是:当用户编辑下拉菜单并选择另一件衬衫时,我希望程序使用该衬衫生成新图像,并替换当前显示的旧图像。
我读过类似问题的答案,有些人建议使用setter和getter,在变量值发生变化时检测并调用函数。我不太确定我是否理解它是如何工作的,也不确定如何在代码中实现它。我要调用的函数位于嵌套循环中。这在这方面有什么区别吗?
这是代码。这个 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 函数,并且它已更改其值。

klsxnrf1

klsxnrf11#

我的问题是,我不知道如何使程序再次运行variable.trace行下面的代码。当一个回调被发送到chosenimage时,我希望它也继续代码的其余部分,现在使用新的SelecteImage值。
这是错误的思维方式。您的回调应该生成组合/图像-您的回调不应该返回任何内容,它应该只具有副作用:

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())

相关问题