В tkinter в виджете ScrolledText удаляется предыдущее изображение при отображении нового через window_create

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
У меня есть примерный код:
Python:
def image():
    root1 = Tk()
    root2 = Toplevel(root1)
    for image in image_list:
         text = scrolledtext.ScrolledText(root2)
         image = ImageTk.PhotoImage(Image.open(image))
         text.create_image(INSERT, window=image)
При добавлении нового изображения, исчезает предыдущее. Что можно сделать чтобы оба изображения оставались в виджете?
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Покажите полный код.
При добавлении нового изображения, исчезает предыдущее.
Возможно проблема в цикле и виджет добавляется изображение только с последней итерации.
 

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
Покажите полный код.

Во
о проблема в цикле и виджет добавляется изображение только с последней итерации.
Python:
def func(thread_number=[0]):
    local_thread_number = thread_number[0]
    thread_number[0] += 1
    root1 = Toplevel(root)
    root1.state('zoomed')
    text_vidget1 = scrolledtext.ScrolledText(root1, width = 200, height = 100, state=DISABLED )
    text_vidget1.pack()
    for i in range(0,len(files)-1):
         b+=1
         if b == b:
              b+=1
          text_vidget1.window_create(INSERT, window=text_vidget)
           text_vidget.insert(1.0,b)
           img_1 = ImageTk.PhotoImage(Image.open(filesi))
           insert = text_vidget1.image_create(INSERT, image =img_1)
def my_thread():
    thread1 = threading.Thread(target = func, name = "Thread-1")
    thread1.start()
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
В этой строке:
Python:
insert = text_vidget1.image_create(INSERT, image =img_1)
происходит добавление изображения в ScrolledText, но отображается только последнее изображение, потому что ссылка на него сохранилась в переменной img_1, а на другие изображения ссылки нигде не сохранились.
Чтобы исправить нужно сохранять ссылки на все изображения.
Вот так например:
Python:
def func(thread_number=[0]):
    ...
    images = []  #  список ссылок на изображения
    for i in range(0,len(files)-1):
         b+=1
         if b == b:
              b+=1
         text_vidget1.window_create(INSERT, window=text_vidget)
         text_vidget.insert(1.0,b)
         img_1 = ImageTk.PhotoImage(Image.open(filesi))
         images.append[img_1]  # добавление ссылки в список
         insert = text_vidget1.image_create(INSERT, image =images[-1])  # добавление изображения в ScrolledText
 

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
В этой строке:
Python:
insert = text_vidget1.image_create(INSERT, image =img_1)
происходит добавление изображения в ScrolledText, но отображается только последнее изображение, потому что ссылка на него сохранилась в переменной img_1, а на другие изображения ссылки нигде не сохранились.
Чтобы исправить нужно сохранять ссылки на все изображения.
Вот так например:
Python:
def func(thread_number=[0]):
    ...
    images = []  #  список ссылок на изображения
    for i in range(0,len(files)-1):
         b+=1
         if b == b:
              b+=1
         text_vidget1.window_create(INSERT, window=text_vidget)
         text_vidget.insert(1.0,b)
         img_1 = ImageTk.PhotoImage(Image.open(filesi))
         images.append[img_1]  # добавление ссылки в список
         insert = text_vidget1.image_create(INSERT, image =images[-1])  # добавление изображения в ScrolledText
Я сделал так как вы подсказали, и у меня такой способ не работает, может есть другое решение?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Я сделал так как вы подсказали, и у меня такой способ не работает, может есть другое решение?
Что именно не работает. Напишите текст ошибки.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Нашел опечатку в своем коде. Возможно из-за нее не заработало.
Нужно эту строку
Python:
images.append[img_1]  # добавление ссылки в список
заменить на такую
Python:
images.append(img_1)  # добавление ссылки в список
 

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
Нашел опечатку в своем коде. Возможно из-за нее не заработало.
Нужно эту строку
Python:
images.append[img_1]  # добавление ссылки в список
заменить на такую
Python:
images.append(img_1)  # добавление ссылки в список
Дело не в этом, я уже исправил вашу опечатку, данный способ у меня не работает даже с исправленной опечаткой.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Напишите какую ошибку выдает.
Просто проблема в вашем коде именно в том что ссылки на изображения нигде не сохраняются.
Я показал вариант решения - у меня он нормально работает.
 

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
При добавлении нового изображения, исчезает предыдущее.
Та же проблема осталась
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Та же проблема осталась
Покажите код (который можно запустить, а не часть).
Чтобы можно было вам продемонстрировать на полном примере что проблема в ссылках на изображение.
 

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
Напишите какую ошибку выдает.
Просто проблема в вашем коде именно в том что ссылки на изображения нигде не сохраняются.
Я показал вариант решения - у меня он нормально работает.
Вот мой полный код:
Python:
def func(thread_number=[0]):  
    global thr, pole_can, img, filesi, img_2, i, p, filesi, i2, i5, a_flag, text_vidget, img_1, a_flag_text, text_vidget1, width_umnosh, height_umnosh, b, root1, text, img_list, img_list_vidget
    local_thread_number = thread_number[0]
    thread_number[0] += 1
    def close():
        thr = None
        root1.destroy()
    #создание окна
    root1 = Toplevel(root)
    root1.state('zoomed')
    text_vidget1 = scrolledtext.ScrolledText(root1, width = 200, height = 100, state=DISABLED )
    text_vidget1.pack()
    close_btn = Button(root1, text="Close", state=DISABLED, command=close)
    close_btn.pack()
    for i in range(0,len(files)-1):
        filesi = files[i]
        stream = open(filesi,"rb")
        bytes = bytearray(stream.read())
        numpyarray = numpy.asarray(bytes, dtype=numpy.uint8)
        bgrImage = cv2.imdecode(numpyarray, cv2.IMREAD_UNCHANGED)
        height, width = bgrImage.shape[:2]
        bgrImage = cv2.resize(bgrImage, (3500, 1700), interpolation = cv2.INTER_CUBIC)
        img_gray = cv2.cvtColor(bgrImage, cv2.COLOR_BGR2GRAY)
        a_img = cv2.medianBlur(img_gray, 5)
        kernel = numpy.ones((5,5), numpy.uint8)
        coords = numpy.column_stack(numpy.where(a_img > 0))
        angle = cv2.minAreaRect(coords)[-1]
        if angle < -45:
            angle = -(90 + angle)
        else:
            angle = -angle
        (h, w) = a_img.shape[:2]
        center = (w // 2, h // 2)
        M = cv2.getRotationMatrix2D(center, angle, 1.0)
        a_img = cv2.warpAffine(a_img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
        filename_img = "{}.png".format(os.getpid())
        cv2.imwrite(filename_img, a_img)
        pytesseract.pytesseract.tesseract_cmd ="C:/Program Files/Tesseract-OCR/tesseract.exe"
        text = pytesseract.image_to_string(Image.open(filename_img),lang= "rus")
        os.remove(filename_img)
        text_vidget = scrolledtext.ScrolledText(root1, width = 50, height = 40)
        text_vidget1.window_create(INSERT, window=text_vidget)
        text_vidget.insert(1.0,text)
        img_1 = ImageTk.PhotoImage(Image.open(filesi))
        img_list.append(img_1)
        insert = text_vidget1.image_create(INSERT, image =img_list[-1])

        text_vidget.bind('<Control-a>', videlit)
        text_vidget.bind('<Control-c>', copy)
        text_vidget.bind('<Control-v>', vstavit)
        b+=1
        time.sleep(0.05)
Я не уверен но может что то здесь не правильно.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот мой полный код:
Это не полный код - это только одна функция, в которую передается много глобальных переменных и запустить такой код нельзя.
Под полным кодом я имел ввиду маленький пример который показывает проблему и который можно запустить.
Вот например в вашем случае это примерно такой код:
Python:
import tkinter as tk
import tkinter.scrolledtext as scrolledtext
from PIL import ImageTk, Image


root = tk.Tk()
text = scrolledtext.ScrolledText(root)
text.pack()
image_list = ['1.jpg', '2.jpg', '3.jpg']


for i, item in enumerate(image_list):
    img_1 = ImageTk.PhotoImage(Image.open(item))
    text.image_create(tk.END, image=img_1)


root.mainloop()
Тут добавляется только последнее изображение.
Чтобы решить проблему - нужно сохранять ссылки на изображения:
Python:
import tkinter as tk
import tkinter.scrolledtext as scrolledtext
from PIL import ImageTk, Image


root = tk.Tk()
text = scrolledtext.ScrolledText(root)
text.pack()


image_list = ['1.jpg', '2.jpg', '3.jpg']
images = []


for i, item in enumerate(image_list):
    img_1 = ImageTk.PhotoImage(Image.open(item))
    images.append(img_1)
    text.image_create(tk.END, image=images[-1])

root.mainloop()
 
  • Мне нравится
Реакции: Nikita 2020

Nikita 2020

Новичок
Пользователь
Май 21, 2020
46
3
8
Это не полный код - это только одна функция, в которую передается много глобальных переменных и запустить такой код нельзя.
Под полным кодом я имел ввиду маленький пример который показывает проблему и который можно запустить.
Вот например в вашем случае это примерно такой код:
Python:
import tkinter as tk
import tkinter.scrolledtext as scrolledtext
from PIL import ImageTk, Image


root = tk.Tk()
text = scrolledtext.ScrolledText(root)
text.pack()
image_list = ['1.jpg', '2.jpg', '3.jpg']


for i, item in enumerate(image_list):
    img_1 = ImageTk.PhotoImage(Image.open(item))
    text.image_create(tk.END, image=img_1)


root.mainloop()
Тут добавляется только последнее изображение.
Чтобы решить проблему - нужно сохранять ссылки на изображения:
Python:
import tkinter as tk
import tkinter.scrolledtext as scrolledtext
from PIL import ImageTk, Image


root = tk.Tk()
text = scrolledtext.ScrolledText(root)
text.pack()


image_list = ['1.jpg', '2.jpg', '3.jpg']
images = []


for i, item in enumerate(image_list):
    img_1 = ImageTk.PhotoImage(Image.open(item))
    images.append(img_1)
    text.image_create(tk.END, image=images[-1])

root.mainloop()
Спасибо, с такой записью всё заработало.
 

Форум IT Специалистов