Python 如何在tkinter中自动移动滚动条?

Python 如何在tkinter中自动移动滚动条?,python,tkinter,Python,Tkinter,我正在申请在tkinter聊天。我的滚动条工作正常。当消息离开帧时,滚动条被触发。但是为了在新消息到达时自动向下滚动,我添加了my_canvas.yview_moveto('1.0'),它会按预期自动滚动,但在最后会留下一个小间隙,因为新消息不会在你收到时看到,而是在一次更新后看到。对不起,我希望我没有把你弄糊涂。 以下是我的完整代码: from tkinter import * from tkinter import ttk send_y = 70 def main(): win

我正在申请在tkinter聊天。我的滚动条工作正常。当消息离开帧时,滚动条被触发。但是为了在新消息到达时自动向下滚动,我添加了
my_canvas.yview_moveto('1.0')
,它会按预期自动滚动,但在最后会留下一个小间隙,因为新消息不会在你收到时看到,而是在一次更新后看到。对不起,我希望我没有把你弄糊涂。 以下是我的完整代码:

from tkinter import *
from tkinter import ttk

send_y = 70

def main():

    window =Tk()
    window.geometry("780x600")
    window.configure(bg="#b3b6ba")
    window.resizable(False,False)
    window.bind('<Return>',lambda event:send())


    # create a main frame

    main_frame=Frame(window,height=565,width=780)
    main_frame.place(x=0,y=0)
    main_frame.propagate(False)

    # create a canvas

    my_canvas=Canvas(main_frame)
    my_canvas.pack(side=LEFT,fill=BOTH,expand=1)

    # Add a scrollbar

    my_scrollbar=ttk.Scrollbar(main_frame,orient=VERTICAL,command=my_canvas.yview)
    my_scrollbar.pack(side=RIGHT,fill=Y)


    # Configure the canvas

    my_canvas.configure(yscrollcommand=my_scrollbar.set)
    my_canvas.bind("<Configure>",lambda e:my_canvas.configure(scrollregion=my_canvas.bbox("all")))

    # create another frame inside the canvas

    second_frame=Frame(my_canvas,bg="pink",height=10,width=10)

    # add that frame to a window in the canvas

    my_canvas.create_window((0,0),window=second_frame,anchor="nw")

    testlabel = Label(second_frame, width=0, text="blah blah blah", anchor=NW, justify=LEFT, bg="black", fg="white",
                          padx=0, pady=0, font=('helvetica', 12), wraplength=235)

    def send():
        global send_y


        send_msgLabel = Label(second_frame, width=0, textvariable=send_msg, anchor=NW, justify=LEFT, bg="black", fg="white",
                              padx=0, pady=0, font=('helvetica', 12), wraplength=235)

        send_msg.set(msg_entry.get())
        send_msgLabel.configure(textvariable=send_msg.get())

        msg_entry.delete(0, END)

        send_msgLabel.pack()



        #send_msgLabel.place(x=0, y=send_y)
        send_y += send_msgLabel.winfo_reqheight()+10
        my_canvas.yview_moveto('1.0')

        my_canvas.configure(scrollregion=my_canvas.bbox("all"))
        #print(my_scrollbar.delta(10,20))
        #my_scrollbar.set(0,1.0)

    msg_entry = Entry(window,width=62,font=("helvetica",14))
    msg_entry.pack()
    msg_entry.place(x=10,y=565)

    send_msg=StringVar()

    send_butt=Button(text="Send",relief=GROOVE,width=9,command=send)
    send_butt.pack()
    send_butt.place(x=700,y=565)

    window.mainloop()

if __name__ == '__main__':
    main()
从tkinter导入*
从tkinter导入ttk
发送y=70
def main():
window=Tk()
窗口几何(“780x600”)
window.configure(bg=“#b3b6ba”)
窗口。可调整大小(False,False)
bind(“”,lambda事件:send())
#创建一个主框架
主框架=框架(窗户,高度=565,宽度=780)
主框架位置(x=0,y=0)
主帧传播(假)
#创建画布
我的画布=画布(主框架)
my_canvas.pack(side=左侧,fill=两侧,expand=1)
#添加一个滚动条
my_scrollbar=ttk.scrollbar(主框架,方向=垂直,命令=my_canvas.yview)
my_scrollbar.pack(侧=右,填充=Y)
#配置画布
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind(“,lambda e:my_canvas.configure(scrollregion=my_canvas.bbox(“全部”))
#在画布内创建另一个框架
第二帧=帧(我的画布,bg=“粉色”,高度=10,宽度=10)
#将该框架添加到画布中的窗口
my_canvas.create_window((0,0),window=second_frame,anchor=“nw”)
testlabel=Label(第二帧,宽度=0,text=“blah blah blah”,anchor=NW,justify=LEFT,bg=“black”,fg=“white”,
padx=0,pady=0,font=('helvetica',12),wraplength=235)
def send():
全球发送
send\u msgLabel=Label(第二帧,宽度=0,textvariable=send\u msg,锚点=NW,对齐=LEFT,bg=“黑色”,fg=“白色”,
padx=0,pady=0,font=('helvetica',12),wraplength=235)
send_msg.set(msg_entry.get())
send_msgLabel.configure(textvariable=send_msg.get())
msg_entry.delete(0,结束)
发送\u msgLabel.pack()
#send_msgLabel.place(x=0,y=send_y)
send_y+=send_msgLabel.winfo_reqheight()+10
my_canvas.yview_moveto('1.0')
my_canvas.configure(scrollregion=my_canvas.bbox(“全部”))
#打印(my_滚动条。增量(10,20))
#我的滚动条设置(0,1.0)
msg_entry=entry(窗口,宽度=62,字体=(“helvetica”,14))
msg_entry.pack()
消息输入位置(x=10,y=565)
send_msg=StringVar()
发送按钮(text=“发送”,浮雕=凹槽,宽度=9,命令=发送)
发送_butt.pack()
发送对接位置(x=700,y=565)
window.mainloop()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
请帮忙。 输出:
正如您所看到的,只有一半的文本是可见的。

您的问题是您调用了

my_canvas.configure(scrollregion=my_canvas.bbox("all"))
在你一直向下滚动之后。因此,最后一个标签不是当前滚动区域的一部分首先更新滚动区域,小间隙将消失

还请注意,您应该这样做

window.update_idletasks()

在更新scrollregion之前,否则您的bbox中不包括您的上一个标签,并且您的scrollregion丢失了它,因此您的标签超出了scrollregion。

代码中存在缩进错误。
def main
是否应该按原样缩进?哦,很抱歉在粘贴代码时发生了这种情况,我将对其进行编辑。既然您只在画布上添加标签,为什么不使用列表框、文本小部件或画布上的文本项?看起来你把问题弄得太难了。如果你使用你提到的任何一个小部件,我认为你不能让一个应用程序看起来像一个真正的聊天应用程序。这取决于你所说的“一个真正的聊天应用程序”是什么意思。例如,直接在画布上绘图比使用标签提供更多的视觉效果。哦,很好,效果不错。现在我还有一个问题,那就是当在帧的末尾输入一条长消息时,只看到消息的一半,我编辑了qn并添加了输出的图像