为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用第 2 个 Tkinter 窗口更改第 1 个图像?

如何使用第 2 个 Tkinter 窗口更改第 1 个图像?

皈依舞 2023-04-25 15:14:25
快速摘要:选择图像时应该更改绿色按钮,但事实并非如此:我有一个window-A带有按钮的 Tkinter,按下该按钮时将使用单独的 Python 文件创建一个新的window-B. Window-B有两个按钮:新屏幕截图或从文件夹中选择图像。用于此的方法应该会更改self.image_selected,以便它可用于更新按钮window-A以具有此新图像。我已经尝试了下面的两行代码,但都没有用。我也没有收到任何错误:        self.button.configure(image = img.image_selected) # first try        self.button['image'] = img.image_selected         # second try这是我的代码(为清楚起见进行了简化):import tkinter as tkimport get_image_or_snipclass ButtonImg:    def __init__(self, master):        self.newWindow = None        self.master = master        self.title = "My Minimum Reproducible Example"        self.fontA = ("arial", 20, "bold")        self.canvas = tk.Canvas(height = 5)        self.canvas.pack()        self.button = tk.Button(bg="#93d9cc", height = 5, text = "Select Image",                                font = self.fontA, command = self.changeImage)        self.button.pack(fill="both")    def changeImage(self):        self.newWindow = tk.Toplevel(self.master)        img = get_image_or_snip.AcquireImage(self.newWindow)        self.button.configure(image = img.image_selected)        #self.button['image'] = img.image_selectedroot = tk.Tk()app = ButtonImg(root)root.mainloop()这是前面提到的get_image_or_snip.py代码:import tkinter as tkfrom tkinter import filedialogfrom PIL import ImageTk, Imageimport snipping_tool
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

print()如果你在之前和之后get_image_or_snip.AcquireImage(self.newWindow)添加,changeImage()那么你应该只看到第一个文本,因为你运行第二个mainloop()并且它永远不会结束这个循环并且永远不会返回changeImage()并且永远不会运行self.button.configure(image=img.image_selected)


你应该只使用一个mainloop()并最终使用


root.wait_window(self.newWindow)

等到你关闭第二个窗口然后它就会运行self.button.configure(image=img.image_selected)


但还有其他问题。


当第二个窗口被销毁时,它会从内存中删除图像,因此您必须将其分配给第一个窗口中的变量。


当您发送文本时,按钮使用字符高度,但是当您分配图像时,它使用以像素为单位的高度,您必须将其从更改为5image.height()`


一个文件中的所有代码


import tkinter as tk

from tkinter import filedialog

from PIL import ImageTk



class AcquireImage:

    

    def __init__(self, master):

        self.master = master

        self.fontA = ("arial", 20, "bold")

        

        self.frame = tk.Frame(master, bg="#1B2631")

        self.frame.pack(fill="both", expand=True)

        

        self.button1 = tk.Button(self.frame, text="Select Image File", padx=10, pady=10, bg="#d9a193",

                              font=self.fontA, command=lambda:self.show_dialogs(1))

        self.button1.grid(row=0, column=0, sticky="nsew")

        

        self.button2 = tk.Button(self.frame, text="Get Screen Snip", padx=10, pady=10, bg="#d9a193",

                              font=self.fontA, command=lambda:self.show_dialogs(2))

        self.button2.grid(row=0, column=1, sticky="nsew")

        

        self.image_selected = None


    def show_dialogs(self, method):

        

        if method == 1:

            ret = filedialog.askopenfilename(initialdir='/home/user/images/')

            if ret:

                self.image_selected = ImageTk.PhotoImage(file=ret)

                self.master.destroy()

     

        elif method == 2:

            self.image_selected = snipping_tool.get_snip()



class ButtonImg:

    

    def __init__(self, master):

        self.newWindow = None

        self.master = master

        self.title = "My Minimum Reproducible Example"

        self.fontA = ("arial", 20, "bold")

        

        self.canvas = tk.Canvas(height=5)

        self.canvas.pack()

        

        self.button = tk.Button(bg="#93d9cc", height=5, text="Select Image",

                                font=self.fontA, command=self.changeImage)

        self.button.pack(fill="both")


    def changeImage(self):

        print('open second window')

        self.newWindow = tk.Toplevel(self.master)

        img = AcquireImage(self.newWindow)

        self.master.wait_window(self.newWindow)

        print('close second window')


        if img.image_selected: # check if image was selected

            self.image = img.image_selected

            self.button.configure(image=self.image, height=self.image.height())

        


root = tk.Tk()

app = ButtonImg(root)

root.mainloop()

顺便说一句:如果你想在不关闭第二个窗口的情况下更改图像,那么你应该将第一个窗口(或第一个窗口中的按钮)作为参数发送给第二个窗口并更改图像show_dialogs()


import tkinter as tk

from tkinter import filedialog

from PIL import ImageTk



class AcquireImage:

    

    def __init__(self, master, first_window):

        self.master = master

        self.first_window = first_window

        

        self.fontA = ("arial", 20, "bold")

        

        self.frame = tk.Frame(master, bg="#1B2631")

        self.frame.pack(fill="both", expand=True)

        

        self.button1 = tk.Button(self.frame, text="Select Image File", padx=10, pady=10, bg="#d9a193",

                              font=self.fontA, command=lambda:self.show_dialogs(1))

        self.button1.grid(row=0, column=0, sticky="nsew")

        

        self.button2 = tk.Button(self.frame, text="Get Screen Snip", padx=10, pady=10, bg="#d9a193",

                              font=self.fontA, command=lambda:self.show_dialogs(2))

        self.button2.grid(row=0, column=1, sticky="nsew")

        

        self.image_selected = None


    def show_dialogs(self, method):

        

        if method == 1:

            ret = filedialog.askopenfilename(initialdir='/home/user/images/')

            if ret:

                self.image_selected = ImageTk.PhotoImage(file=ret)

                self.first_window.image = self.image_selected

                self.first_window.button.configure(image=self.first_window.image, height=self.first_window.image.height())


        elif method == 2:

            self.image_selected = snipping_tool.get_snip()



class ButtonImg:

    

    def __init__(self, master):

        self.newWindow = None

        self.master = master

        self.title = "My Minimum Reproducible Example"

        self.fontA = ("arial", 20, "bold")

        

        self.canvas = tk.Canvas(height=5)

        self.canvas.pack()

        

        self.button = tk.Button(bg="#93d9cc", height=5, text="Select Image",

                                font=self.fontA, command=self.changeImage)

        self.button.pack(fill="both")


    def changeImage(self):

        self.newWindow = tk.Toplevel(self.master)

        img = AcquireImage(self.newWindow, self) # first window as `self` but you can send `self.button`


        


root = tk.Tk()

app = ButtonImg(root)

root.mainloop()


查看完整回答
反对 回复 2023-04-25
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信