Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何添加更多语音气泡?-特金特聊天机器人_Python 3.x_Tkinter_Scrollbar_Chatbot - Fatal编程技术网

Python 3.x 如何添加更多语音气泡?-特金特聊天机器人

Python 3.x 如何添加更多语音气泡?-特金特聊天机器人,python-3.x,tkinter,scrollbar,chatbot,Python 3.x,Tkinter,Scrollbar,Chatbot,我一直在tkinter开发一个聊天机器人,并一直使用它作为我代码的起点。我希望能够添加更多的语音气泡(我只能制作三个),然后滚动浏览它们 我怎样才能做到这一点 我的代码: 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,heigh

我一直在tkinter开发一个聊天机器人,并一直使用它作为我代码的起点。我希望能够添加更多的语音气泡(我只能制作三个),然后滚动浏览它们

我怎样才能做到这一点

我的代码:

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()
从tkinter导入*
root=Tk()
框架=框架(根,宽度=200,高度=200)
frame.grid(行=0,列=0,列span=2)
画布=画布(框架,bg=“白色”,宽度=300,高度=300,滚动区域=(0,0500500))
canvas.pack(side=LEFT,expand=True,fill=BOTH)
vbar=滚动条(frame,orient=“vertical”,command=canvas.yview)
vbar.pack(侧面=右侧,填充=Y)
canvas.configure(yscrollcommand=vbar.set)
气泡=[]
类气泡:
def uuu init uuuu(self,master,message=”“):
self.master=master
self.frame=帧(主帧,bg=“浅灰色”)
self.i=self.master.create_窗口(90160,窗口=self.frame)
标签(self.frame,text=message,font=(“Helvetica”,9),bg=“浅灰色”).grid(行=1,列=0)
root.update_idletasks()
self.master.create_polygon(self.draw_triangle(self.i),fill=“浅灰色”,outline=“浅灰色”)
def draw_三角形(自身,小部件):
x1,y1,x2,y2=self.master.bbox(小部件)
返回x1,y2-8,x1-10,y2+5,x1,y2
def发送消息(事件):
如果出现气泡:
画布移动(全部,0,-65)
a=BotBubble(canvas,message=entry.get())
气泡。附加(a)
入口=入口(根,宽度=100)
entry.grid(行=1,列=0)
entry.bind(“,发送消息)
root.mainloop()

我已修改了您的代码:

  • 创建画布时不要设置
    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()
从tkinter导入*
root=Tk()
帧=帧(根)
frame.pack(填充=两者,扩展=1)
画布=画布(框架,bg=“白色”)
canvas.pack(side=LEFT,expand=True,fill=BOTH)
vbar=滚动条(frame,orient=“vertical”,command=canvas.yview)
vbar.pack(侧面=右侧,填充=Y)
canvas.configure(yscrollcommand=vbar.set)
气泡=[]
线间距=10#气泡之间的间距
类气泡:
def uuu init uuuu(self,master,message=”“):
self.master=master
self.frame=帧(主帧,bg=“浅灰色”)
bbox=self.master.bbox(全部)
y=(如果bbox为0,则bbox[3])+线间距
self.i=self.master.create_窗口(15,y,window=self.frame,anchor='nw')
标签(self.frame,text=message,font=(“Helvetica”,9),bg=“浅灰色”).grid(行=1,列=0)
self.master.update()
self.master.create_polygon(self.draw_triangle(self.i),fill=“浅灰色”,outline=“浅灰色”)
def draw_三角形(自身,小部件):
x1,y1,x2,y2=self.master.bbox(小部件)
返回x1,y2-8,x1-10,y2+5,x1,y2
def update_滚动区域(事件=无):
canvas.config(scrollregion=canvas.bbox(全部))
canvas.yview_moveto(1)#滚动到底部
def发送消息(事件):
a=BotBubble(canvas,message=entry.get())
气泡。附加(a)
更新_scrollregion()
入口=入口(根,宽度=100)
入口包装(填充=X)
entry.bind(“,发送消息)
进入。焦点力量()
frame.bind(“”,更新\u滚动区域)
root.mainloop()

创建
画布时不要设置
滚动区域
。将其设置在
send_message()
函数的末尾。你能给我举个例子说明我是如何做到的吗@ACW1668谢谢,这正是我所需要的@ACW1668你知道我将如何将其添加到另一端以供机器人响应吗@acw1668