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

快速摘要:选择图像时应该更改绿色按钮,但事实并非如此:

http://img2.mukewang.com/64477de40001605f06600151.jpg

我有一个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 tk

import get_image_or_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 = get_image_or_snip.AcquireImage(self.newWindow)

        self.button.configure(image = img.image_selected)

        #self.button['image'] = img.image_selected


root = tk.Tk()

app = ButtonImg(root)

root.mainloop()

这是前面提到的get_image_or_snip.py代码:


import tkinter as tk

from tkinter import filedialog

from PIL import ImageTk, Image

import snipping_tool




皈依舞
浏览 91回答 1
1回答

暮色呼如

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 tkfrom tkinter import filedialogfrom PIL import ImageTkclass 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 tkfrom tkinter import filedialogfrom PIL import ImageTkclass 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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python