重新运行函数值更改的部分代码
Rerun part of code on function value change
我目前正在尝试创建一个程序,允许用户查看用户选择的衬衫与不同裤子的图片。
该程序包含一个目录,里面装满了衬衫的图片,还有一条裤子。
用户从下拉菜单中选择一件衬衫,然后程序生成、保存并显示使用该衬衫创建的所有可能组合。
为此,我使用了 Tkinter & PIL (Pillow)。
这是我的问题: 当用户编辑下拉菜单并选择另一件衬衫时,我想要使用那件衬衫生成新图像并替换当前显示的旧图像的程序。
我看过类似问题的答案,有些人建议 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
函数并且它已更改其值之前,代码不会继续。
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())
我目前正在尝试创建一个程序,允许用户查看用户选择的衬衫与不同裤子的图片。
该程序包含一个目录,里面装满了衬衫的图片,还有一条裤子。 用户从下拉菜单中选择一件衬衫,然后程序生成、保存并显示使用该衬衫创建的所有可能组合。 为此,我使用了 Tkinter & PIL (Pillow)。
这是我的问题: 当用户编辑下拉菜单并选择另一件衬衫时,我想要使用那件衬衫生成新图像并替换当前显示的旧图像的程序。
我看过类似问题的答案,有些人建议 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
函数并且它已更改其值之前,代码不会继续。
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())