代码之家  ›  专栏  ›  技术社区  ›  python3 programmer

将点击tkinter按钮的结果传递给另一个按钮

  •  0
  • python3 programmer  · 技术社区  · 1 年前

    我想制作一个GUI,其中有两个按钮:从一个按钮我可以选择图像,从另一个按钮可以显示图像 cv2.imshow 。我想使用 cv2.imshow 因为以后我想用处理图像 cv2 。这是我的代码:

    import tkinter as tk
    import tkinter.filedialog as fd
    import cv2
    
    def select(label):
        filepath = fd.askopenfilename()
        text = "Selected image: {}".format(filepath)
        label.config(text=text)
        return filepath
    
    def show_image(image_path):
        image = cv2.imread(image_path)
        cv2.imshow("Image", image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    root = tk.Tk()
    root.geometry("600x400")
    frame = tk.Frame(root)
    frame.pack()
    label_frame = tk.LabelFrame(frame)
    label_frame.grid()
    label = tk.Label(frame, text="Label")
    label.grid()
    func1 = lambda: select(label)
    button1 = tk.Button(frame, text="select", command=func1)
    button1.grid()
    func2 = lambda: show_image(func1)
    button2 = tk.Button(frame, text="show", command=func2)
    button2.grid()
    root.mainloop()
    

    我尝试了很多事情,例如改变 command=func2 command=show_image ,但似乎什么都不起作用。我认为中的图像路径变量 show_image(image_path) 是一个函数,因为它是用lambda定义的。我能以某种方式将输出转换为字符串,使函数正常工作吗?我需要使用lambda,因为我需要将参数传递给按钮命令。

    1 回复  |  直到 1 年前
        1
  •  2
  •   Harmony    1 年前

    看起来你正在通过 image_path show_image 通过您的 func2 λ。当你设置 func2 = lambda: show_image(func1) 使命感 func1 内部show_image不会像您所期望的那样返回filepath字符串。相反,它调用 select(label) 返回 filepat h、 但是你没有使用这个返回 filepath 正确地作为show_image的参数。你本质上是想展示 函数1 本身,而不是结果。

    要解决此问题,您可以修改您的方法以确保 函数2 从select(label)接收作为字符串的文件路径,然后将其正确传递给show_image。你可以试试这样的方法:

    import tkinter as tk
    import tkinter.filedialog as fd
    import cv2
    
    def select(label):
        filepath = fd.askopenfilename()
        text = "Selected image: {}".format(filepath)
        label.config(text=text)
        return filepath
    
    def show_image(image_path):
        image = cv2.imread(image_path)
        cv2.imshow("Image", image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    root = tk.Tk()
    root.geometry("600x400")
    frame = tk.Frame(root)
    frame.pack()
    label_frame = tk.LabelFrame(frame)
    label_frame.grid()
    label = tk.Label(frame, text="Label")
    label.grid()
    
    # Use a global variable to store the selected filepath
    selected_filepath = None
    
    def update_filepath():
        global selected_filepath
        selected_filepath = select(label)
    
    def display_image():
        global selected_filepath
        if selected_filepath:
            show_image(selected_filepath)
    
    button1 = tk.Button(frame, text="select", command=update_filepath)
    button1.grid()
    
    button2 = tk.Button(frame, text="show", command=display_image)
    button2.grid()
    
    root.mainloop()