Увеличьте изображение во всплывающем окне в Python Tkinter - PullRequest
0 голосов
/ 04 октября 2019

Хай, может кто-нибудь объяснить мне, почему этот код:

from tkinter import *
from io import BytesIO
import requests
from PIL import Image , ImageTk
def full_dimensions (imag_fs):
    s = Tk()
    img = Label(s, image = imag_fs)
    img.pack()
    s.mainloop()

def mainz ():
    r = Tk ()
    _url = 'https://i.imgur.com/4m7AHVu.gif'
    _img = requests.get(_url)
    if _img.status_code ==200:
        _content = BytesIO(_img.content)
    else:
        _content = 'error.gif'
    _x = Image.open(_content)
    imag_fs = ImageTk.PhotoImage(_x)
    _x.thumbnail((100,100),Image.ANTIALIAS)
    imag = ImageTk.PhotoImage(_x)
    img = Button(r, image = imag, command = lambda:full_dimensions(imag_fs))
    img.grid(column=3,row=1)
    r.mainloop()

mainz()

возвращает мне этот вывод, когда я нажимаю на кнопку

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python37\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "E:\test_image\prova.py", line 23, in <lambda>
    img = Button(r, image = imag, command = lambda:full_dimensions(imag_fs))
  File "E:\test_image\prova.py", line 7, in full_dimensions
    img = Label(s, image = imag_fs)
  File "C:\Python37\lib\tkinter\__init__.py", line 2766, in __init__
    Widget.__init__(self, master, 'label', cnf, kw)
  File "C:\Python37\lib\tkinter\__init__.py", line 2299, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "pyimage1" doesn't exist

Я хочу сделать всплывающее окно Windowsкогда нажимаете на кнопку с изображением в реальном измерении или как бы больше. Итак, первая проблема заключается в том, что я хочу понять, почему этот код не работает. Тогда, если кто-то может предложить модуль, который может показать окна с изображением и инструментом навигации, таким как полосы прокрутки y и x и кнопки увеличения и уменьшения, это было бы здорово, если нет, я постараюсь создатьФункция моей собственной. спасибо.

1 Ответ

2 голосов
/ 04 октября 2019

Вам необходимо сохранить ссылку на изображение.

Вы также должны использовать только один корень tk.Tk() и один mainloop;Вы можете отобразить новое всплывающее окно с tk.Toplevel.

enter image description here

import tkinter as tk
from io import BytesIO
import requests
from PIL import Image , ImageTk


def full_dimensions(imag_fs):
    top = tk.Toplevel(root)
    img = tk.Label(top, image=imag_fs)
    img.pack()


def get_image():
    _url = 'https://i.imgur.com/4m7AHVu.gif'
    _img = requests.get(_url)
    if _img.status_code == 200:
        _content = BytesIO(_img.content)
    else:
        _content = 'error.gif'
    print('image loaded')
    return _content


root = tk.Tk()

_content =  get_image()   
_x = Image.open(_content)
imag_fs = ImageTk.PhotoImage(_x)
_x.thumbnail((100, 100), Image.ANTIALIAS)

imag = ImageTk.PhotoImage(_x)
img = tk.Button(root, image=imag, command=lambda: full_dimensions(imag_fs))
img.grid(column=3, row=1)

root.mainloop()
...