我想加载一堆图像,将它们分成几对,然后在窗口中并排显示这些对(一对)。我还要添加一个按钮来选择要显示的对。
def select_files():
files = filedialog.askopenfilenames(title="Select photo", filetypes=(("jpeg files", "*.jpg"), ("all files", "*.*")))
# many lines of code for the algorithm that splits images into pair
pairs.append([photo1, photo2])
root = Tk()
selectButton = Button(root, text="Select", command=select_files)
selectButton.place(x=5, y=500)
show_first = ImageTk.PhotoImage(img1)
show_second = ImageTk.PhotoImage(img2)
panel1 = Label(root, image=show_first)
panel1.place(x=5, y=5)
panel2 = Label(root, image=show_second)
panel2.place(x=200, y=5)
root.geometry("%dx%d+500+500" % (550, 550))
root.mainloop()
但是如何将图像传递给show_first和show_second?
P.S。 pairs.append([photo1, photo2])
行中的 photo1 和 photo2 都是列表,其中路径存储在photo1 [0]中,图像大小存储在photo1 [1]
答案 0 :(得分:1)
问题在于tkinter
回调¹不直接支持参数,而忽略返回值。可以通过使用带有默认参数的lambda
和“使用可变对象(例如列表)”作为默认参数来解决该问题,因为当回调函数对其进行修改时,更改会反映在调用者作用域中。
例如,您可以使用参数(列表)来定义select_files
,该参数是您可以随意修改的可变参数
def select_files(pairs):
pairs.clear() # this voids the content of the list
# many lines of code for the algorithm that splits images into pairs
pairs.append(['a.jpg', 'b.jpg'])
然后在您的主机中,修改command=...
以引入默认参数
pairs = []
...
selectButton = Button(root, text = "Select",
command = lambda pairs=pairs: select_files(pairs))
最终,您可以访问每对图像文件名
for fn1, fn2 in pairs:
...
要在实践中展示它,
>>> def gp(pairs):
... pairs.append([1,2])
...
>>> pairs = []
>>> (lambda p=pairs: gp(p))()
>>> pairs
[[1, 2]]
>>>
和一个反例
>>> def gp(pairs):
... pairs = [[1, 2]]
...
>>> pairs = []
>>> (lambda p=pairs: gp(p))()
>>> pairs
[]
>>>
表明您应该从不分配给函数参数...