Python tkinter 列表框高度不工作

Python tkinter ListBox height not working

我在让我的 ListBox 成为我的网格配置 Tk 中的正确高度时遇到问题。它应该有 6 行高,但比这要少得多。
我是 运行 python 3.8.
我正在 Windows 10 台计算机上工作,但我认为这不重要。
我想我只是错过了一些小东西。
感谢任何帮助。
我已经搜索过了,但在这里找不到答案。

from tkinter import *
import tkinter.font as tkFont
from tkinter import filedialog

window = Tk()
btn_font = tkFont.Font(family='Ariel', size=20, weight='bold')

# Define functions here
def main_menu_gui():
    pass

main_menu_button = Button(window, text='Main Menu',
                                     command=main_menu_gui, font=btn_font, width=13)
main_menu_button.grid(row=0, column=0, padx=5, pady=3, sticky=W)
new_question_button = Button(window, text='New Question',
                                     command=main_menu_gui, font=btn_font, width=13)
new_question_button.grid(row=0, column=1, padx=5, pady=3)
save_question_button = Button(window, text='Save Question',
                                     command=main_menu_gui, font=btn_font, width=13)
save_question_button.grid(row=0, column=2, padx=5, pady=3)
delete_question_button = Button(window, text='Delete Question',
                                     command=main_menu_gui, font=btn_font, width=13)
delete_question_button.grid(row=0, column=3, padx=5, pady=3)
question_label = Label(text='Question', font=btn_font, justify="left")
question_label.grid(row=1, column=0, padx=5, pady=3)
question_entry = Entry(window, font=btn_font, width=47)
question_entry.grid(row=1, column=1, columnspan=3, padx=5, pady=3)
question_1_label = Label(text=f'Answer 1', font=btn_font, justify="left")
question_1_label.grid(row=2, column=0, padx=5, pady=3)
question_1_entry = Entry(window, font=btn_font, width=47)
question_1_entry.grid(row=2, column=1, columnspan=3, padx=5, pady=3)
question_2_label = Label(text=f'Answer 2', font=btn_font, justify="left")
question_2_label.grid(row=3, column=0, padx=5, pady=3)
question_2_entry = Entry(window, font=btn_font, width=47)
question_2_entry.grid(row=3, column=1, columnspan=3, padx=5, pady=3)
question_3_label = Label(text=f'Answer 2', font=btn_font, justify="left")
question_3_label.grid(row=4, column=0, padx=5, pady=3)
question_3_entry = Entry(window, font=btn_font, width=47)
question_3_entry.grid(row=4, column=1, columnspan=3, padx=5, pady=3)
question_4_label = Label(text=f'Answer 4', font=btn_font, justify="left")
question_4_label.grid(row=5, column=0, padx=5, pady=3)
question_4_entry = Entry(window, font=btn_font, width=47)
question_4_entry.grid(row=5, column=1, columnspan=3, padx=5, pady=3)
right_label = Label(text='Right Feedback', font=btn_font, justify="left")
right_label.grid(row=6, column=0, padx=5, pady=3)
right_entry = Entry(window, font=btn_font, width=47)
right_entry.grid(row=6, column=1, columnspan=3, padx=5, pady=3)
wrong_label = Label(text='Wrong Feedback', font=btn_font, justify="left")
wrong_label.grid(row=7, column=0, padx=5, pady=3)
wrong_entry = Entry(window, font=btn_font, width=47)
wrong_entry.grid(row=7, column=1, columnspan=3, padx=5, pady=3)
question_list = Listbox(window, height=6)
question_scroll = Scrollbar(question_list, orient=VERTICAL)
question_list.config(yscrollcommand=question_scroll.set)
question_scroll.config(command=question_list.yview)
question_list.grid(row=8, column=0, columnspan=4, padx=5, pady=3, sticky=N+E+S+W)
question_list.columnconfigure(0, weight=3)
question_scroll.grid(column=4, sticky=N+S)

window.mainloop()

问题的根源在于这一行:

question_scroll = Scrollbar(question_list, orient=VERTICAL)

请注意,您将滚动条放在列表框中。当您随后在滚动条上调用 grid 时,grid 的默认行为是扩大或缩小小部件以适合其子项,因此列表框的高度会缩小以适合滚动条。

不是把滚动条放在question_list,你需要把它放在window

question_scroll = Scrollbar(window, orient=VERTICAL)

然后您会注意到您将滚动条放在列表框下方的行中。相反,你应该把它放在同一行:

question_scroll.grid(row=8, column=4, sticky=N+S)

如果您希望滚动条出现在列表框内,这在现代 UI 中很常见,您可以创建一个单独的框架并将列表框和滚动条都放在框架内。如果您给框架一个边框,然后删除列表框的边框,滚动条将出现在列表框旁边。