scroll canvas.create_text

У меня есть главный Canvas с изображение. Мне нужно добавить виджет с прокруткой, для добавления в него текст, но ScrolledText мне не подходит так как мне нужно сделать фон задний, под текстом, полупрозрачный, чтобы проглядывалась картинка на canvas. Поэтому я заготовил полу прозрачный fon.png. Я понимаю что без canvas это не решить. Но проблема в том, что при создании виджета типа (Canvas, Frame, и т.д. для добавлния в них scroll функции) у них изначально есть задний фон и полупрозрачным его никак не сделать, если накладывать сверху после картинку, то видно же будет это стандартный фон под изображением.

Как решить эту делему? Мне нужен виджет, с полупрозрачным фоном, и чтобы я могу туда добавлять текст и у него была функция прокрутки.

код чисто с главным изображением, как дальше не знаю.

from tkinter import *
from PIL import ImageTk, Image

class game(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.canvas = Canvas(root, width=800, height=600)
        self.canvas.pack(fill="both", expand=True)

        self.background = Image.open('image.jpg'))
        self.img1 = ImageTk.PhotoImage(self.background)
        self.image1 = self.canvas.create_image(0, 0, anchor=NW, image=self.img1)


if __name__ == "__main__":
    root = Tk()
    app = test(root)
    root.mainloop()

Ответы (1 шт):

Автор решения: T800

я решил все так. добавив сам текст реакцию на прокрутку мыши. А самое главное весь текст добавлял в список

txtInfo = []
txtInfo.append('text1')
txtInfo.append('text2')
self.canvastext = self.canvas.create_text(self.width-302, 10, anchor=NW, text=self.scrollText(txtInfo), width=302, fill='white')
self.canvas.tag_bind(self.canvastext, '<Button-4>', lambda event: self.scrolling('+'))
        self.canvas.tag_bind(self.canvastext, '<Button-5>', lambda event: self.scrolling('-'))

далее добавил функции для обработки списка и движения колесика

def scrollText(self,txt=[]):
    lst = []
    # колич. записей
    if len(txt)>50:
        col = len(txt) - 50
        for cc in range(0, col):
            txt.remove(txt[col-cc])
    # отображение
    if len(txt)>15:
        self.ii = len(txt)-14
        self.jj = self.ii+14
        for rr in range(self.ii, self.jj):
            lst.append(txt[rr])
    else:
        lst = txt
    return ''.join(lst)

def scrolling(self,updown):
    lst = []
    if updown == '+':
        if self.ii-1 > -1:
            self.ii = self.ii-1
            self.jj = self.ii+14
            for rr in range(self.ii, self.jj):
                lst.append(txtInfo[rr])
            self.canvas.itemconfigure(self.canvastext, text=''.join(lst))
    else:
        if self.ii+15 < len(txtInfo)+1:
            self.ii = self.ii + 1
            self.jj = self.ii + 14
            for rr in range(self.ii, self.jj):
                lst.append(txtInfo[rr])
            self.canvas.itemconfigure(self.canvastext, text=''.join(lst))

возможно грубо, но главное работает

→ Ссылка