Как добавить больше речевых пузырей? - Tkinter Chatbot - PullRequest
0 голосов
/ 26 марта 2020

Я работал над чат-ботом в tkinter и использовал это, { ссылка } в качестве отправной точки для моего кода. Я хочу иметь возможность добавлять больше речевых пузырей (я могу сделать только три), а затем прокручивать их.

Как бы я смог это сделать? 1010 *?

Мой код:

from tkinter import *
root = Tk()

frame = Frame(root,width=200,height=200)
frame.grid(row=0,column=0,columnspan=2)
canvas = Canvas(frame,bg="white",width=300,height=300,scrollregion=(0,0,500,500))
canvas.pack(side=LEFT,expand=True,fill=BOTH)
vbar = Scrollbar(frame,orient="vertical",command=canvas.yview)
vbar.pack(side=RIGHT,fill=Y)
canvas.configure(yscrollcommand=vbar.set)

bubbles = []

class BotBubble:
    def __init__(self,master,message=""):
        self.master = master
        self.frame = Frame(master,bg="light grey")
        self.i = self.master.create_window(90,160,window=self.frame)
        Label(self.frame, text=message,font=("Helvetica", 9),bg="light grey").grid(row=1,column=0)
        root.update_idletasks()
        self.master.create_polygon(self.draw_triangle(self.i),fill="light grey",outline="light grey")

    def draw_triangle(self,widget):
        x1, y1, x2, y2 = self.master.bbox(widget)
        return x1, y2 - 8, x1 - 10, y2 + 5, x1, y2

def send_message(event):
    if bubbles:
       canvas.move(ALL, 0, -65)
    a = BotBubble(canvas,message=entry.get())
    bubbles.append(a)

entry = Entry(root,width=100)
entry.grid(row=1,column=0)
entry.bind("<Return>",send_message)
root.mainloop()

1 Ответ

1 голос
/ 26 марта 2020

Я изменил ваш код:

  • не устанавливать scrollregion при создании холста
  • обновить scrollregion холста после добавления нового пузыря или изменения размера окна
  • не прокручивайте старые пузырьки, просто добавьте новый пузырь ниже последнего пузырька

Обновленный код:

from tkinter import *

root = Tk()

frame = Frame(root)
frame.pack(fill=BOTH, expand=1)

canvas = Canvas(frame, bg="white")
canvas.pack(side=LEFT, expand=True, fill=BOTH)

vbar = Scrollbar(frame, orient="vertical", command=canvas.yview)
vbar.pack(side=RIGHT, fill=Y)

canvas.configure(yscrollcommand=vbar.set)

bubbles = []
LINE_GAP = 10 # gap between bubbles

class BotBubble:
    def __init__(self, master, message=""):
        self.master = master
        self.frame = Frame(master, bg="light grey")
        bbox = self.master.bbox(ALL)
        y = (bbox[3] if bbox else 0) + LINE_GAP
        self.i = self.master.create_window(15, y, window=self.frame, anchor='nw')
        Label(self.frame, text=message, font=("Helvetica",9), bg="light grey").grid(row=1, column=0)
        self.master.update()
        self.master.create_polygon(self.draw_triangle(self.i), fill="light grey", outline="light grey")

    def draw_triangle(self,widget):
        x1, y1, x2, y2 = self.master.bbox(widget)
        return x1, y2-8, x1-10, y2+5, x1, y2

def update_scrollregion(event=None):
    canvas.config(scrollregion=canvas.bbox(ALL))
    canvas.yview_moveto(1) # scroll to bottom

def send_message(event):
    a = BotBubble(canvas, message=entry.get())
    bubbles.append(a)
    update_scrollregion()

entry = Entry(root, width=100)
entry.pack(fill=X)
entry.bind("<Return>", send_message)
entry.focus_force()

frame.bind('<Configure>', update_scrollregion)

root.mainloop()
...