gpt4 book ai didi

python - 如何使用第二个 Tkinter 窗口在第一次更改图像?

转载 作者:行者123 更新时间:2023-12-04 09:15:38 24 4
gpt4 key购买 nike

快速摘要:选择图像时,绿色按钮应该会发生变化,但它不会:
enter image description here
我有一个 Tkinter window-A带有一个按钮,按下该按钮时将使用单独的 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


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
self.master.mainloop()

def show_dialogs(self, method):
if method == 1:
ret = filedialog.askopenfilename()
load_img = Image.open(ret)
self.image_selected = ImageTk.PhotoImage(load_img)

if method == 2:
ret = snipping_tool.get_snip()
self.image_selected = ret


def main():
root = tk.Tk()
AcquireImage(root)
root.mainloop()


if __name__ == '__main__':
main()


最佳答案

如果您添加 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)但还有其他问题。
当第二个窗口被销毁时,它会从内存中删除图像,因此您必须将其分配给第一个窗口中的变量。
当您发送文本时,按钮使用字符高度,但是当您分配图像时,它使用以像素为单位的高度,您必须将其从 5 更改为到 image.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()

编辑:关于创建文档 Dialog Windows

关于python - 如何使用第二个 Tkinter 窗口在第一次更改图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63236137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com