Моя библиотека графиков должна иметь возможность отображать несколько графиков одновременно, каждый из которых представлен в виде изображения PIL, и каждый из которых должен отображаться как свое собственное окно.Окна должны быть независимыми, поэтому закрытие одного из них не должно влиять на остальные, но когда все они закрыты, основной цикл должен выйти.Этого поведения было легко достичь в qt и wx, но в qt это пока сложно.
Вот самое близкое, что я до сих пор прошел:
from six.moves import tkinter
from PIL import ImageTk
class Window:
def __init__(self, img):
self.window = tkinter.Toplevel()
self.window.minsize(img.width, img.height)
self.canvas = tkinter.Canvas(self.window, width=img.width, height=img.height)
self.canvas.pack()
self.canvas.configure(background="white")
self.photo = ImageTk.PhotoImage(img)
self.sprite = self.canvas.create_image(0, 0, image=self.photo, anchor=tkinter.NW)
windows = []
for img in imgs:
windows.append(Window(img))
if len(windows) > 0: windows[0].window.mainloop()
Это отображает изображение вкаждое окно и каждое из этих окон может быть закрыто независимо.Но он также отображает пустое корневое окно, которое необходимо закрыть для выхода из основного цикла, и которое приведет к закрытию всех окон при закрытии, а это не то поведение, которое мне нужно.
Если я заменю tkinter.Toplevel()
с tkinter.Tk()
, затем create_image завершается ошибкой для второго окна с непонятным сообщением об ошибке «pyimageX не существует», где X - увеличивающееся целое число.
Придется ли мне создавать невидимое корневое окно, а затемвручную подсчитать, сколько дочерних окон закрылось, и вызвать уничтожение невидимого корневого окна, когда все они закрылись, чтобы получить поведение, которое я ищу?Или есть простой способ добиться этого?
Редактировать: Просто чтобы уточнить: Моя программа в основном не является приложением Tk.Он тратит почти все свое время, занимаясь другими делами, и лишь временно использует Tk в одной функции для отображения некоторых графиков.Вот почему важно, чтобы основной цикл завершался после закрытия графиков, чтобы программа могла возобновить свою нормальную работу.Подумайте о том, как show()
в matplotlib работает на примере этого сценария.