使用路径数组显示图像对

时间:2018-08-21 19:18:50

标签: python tkinter

我想加载一堆图像,将它们分成几对,然后在窗口中并排显示这些对(一对)。我还要添加一个按钮来选择要显示的对。

    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]

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
[]
>>> 

表明您应该从不分配给函数参数...