滚动条进入 python tkinter 讨论

Scrollbar into a python tkinter discussion

from tkinter import *

window = Tk()

ia_answers= "test\n"
input_frame = LabelFrame(window, text="User :", borderwidth=4)
input_frame.pack(fill=BOTH, side=BOTTOM)

input_user = StringVar()
input_field = Entry(input_frame, text=input_user)
input_field.pack(fill=BOTH, side=BOTTOM)

def onFrameConfigure(canvas):
'''Reset the scroll region to encompass the inner frame'''
    canvas.configure(scrollregion=canvas.bbox("all"))
canvas = Canvas(window, borderwidth=0, background="white")
ia_frame = LabelFrame(canvas, text="Discussion",borderwidth = 15, height = 100, width = 100)
ia_frame.pack(fill=BOTH, side=TOP)
scroll = Scrollbar(window, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=scroll.set)

scroll.pack(side=RIGHT, fill=Y)
canvas.pack(fill=BOTH, expand=True)
canvas.create_window((4,4), window=ia_frame, anchor="nw")
ia_frame.bind("<Configure>", lambda event, canvas=canvas:onFrameConfigure(canvas))




user_says = StringVar()
user_text = Label(ia_frame, textvariable=user_says, anchor = NE, justify =   RIGHT, bg="white") 
user_text.pack(fill=X) 

ia_says = StringVar()
ia_text = Label(ia_frame, textvariable=ia_says, anchor = NW, justify = LEFT, bg="white") 
ia_text.pack(fill=X) 

user_texts = []
ia_texts = []
user_says_list = []
ia_says_list = []
def Enter_pressed(event):
    """Took the current string in the Entry field."""
    input_get = input_field.get()
    input_user.set("")
    user_says1 = StringVar()
    user_says1.set(input_get + "\n")
    user_text1 = Label(ia_frame, textvariable=user_says1, anchor = NE, justify =   RIGHT, bg="white") 
    user_text1.pack(fill=X)
    user_texts.append(user_text1)
    user_says_list.append(user_says1)
    ia_says1 = StringVar()
    ia_says1.set(ia_answers)
    ia_text1 = Label(ia_frame, textvariable=ia_says1, anchor = NW, justify = LEFT, bg="white") 
    ia_text1.pack(fill=X)
    ia_texts.append(ia_text1)
    ia_says_list.append(ia_says1)

input_field.bind("<Return>", Enter_pressed)
window.mainloop()

嗨,我尝试用 tkinter 构建一个 GUI,但我有两个问题,LabelFrame/Canvas 没有完全填满 window,我无法让滚动条自动显示向下滚动。 你能帮我一下吗,非常感谢。 伊兰罗斯勒.

您需要手动控制内框的宽度,因为它由 canvas 管理。您可以在绑定到 canvas 的 <Configure> 事件中更改宽度(即:当 canvas 更改大小时,您必须更改框架的大小)。

您需要能够在 canvas 上引用 window 对象,这意味着您需要保存 id,或者给它一个标签。

下面是给它一个标签的例子:

canvas.create_window((4,4), window=ia_frame, anchor="nw", tags=("innerFrame",))

下面是 canvas 改变大小时如何改变宽度:

def onCanvasConfigure(event):
    canvas = event.widget
    canvas.itemconfigure("innerFrame", width=canvas.winfo_width() - 8)

canvas.bind("<Configure>", onCanvasConfigure)

要向下滚动,就像滚动条一样调用 yview 命令。您需要在 window 有机会刷新之后实现这一点。

例如,将此添加为 Enter_pressed 中的最后一行:

def Enter_pressed(event):
    ...
    canvas.after_idle(canvas.yview_moveto, 1.0)