在Tkinter中将列表框扩展为2列

0 投票
2 回答
4792 浏览
提问于 2025-04-18 11:06

我有一个界面,里面有三个框架。其中两个框架在左边,分别叫做 frame1frame2,还有一个框架在右边,叫做 frame3

我想再创建一个框架,叫做 frame4,上面有一个标签,写着 Output,下面要有一个列表框(Listbox)。我希望这两个组件能够覆盖在之前的框架上,并且通过 grid 管理器把它们放在一个单元格里。

不过我不太确定列表框(Listbox)是不是我应该用的组件。我想要一个可以显示我在应用程序中运行的程序输出的东西。我也考虑过用 Entry,但我需要一个可以显示多行内容的组件。

这是我目前写的代码:

from Tkinter import *

root = Tk()

frame1 = Frame(root)
frame1.grid(row=0,column=0)

frame2 = Frame(root)
frame2.grid(row=1,column=0)

frame3 = Frame(root)
frame3.grid(row=0,column=1)

frame4 = Frame(root)
frame4.grid(row=2,columnspan=2)
l5 = Label(frame4, text='Output:').grid(row=2,columnspan=2)
output = Listbox(frame4, height=5)
#output.grid(row=2,column=0,columnspan=2)
#output.pack(side=LEFT,  fill=BOTH, expand=1)

root.mainloop()

我已经成功让标签覆盖在其他框架上,但当我取消注释最后两行代码时,界面就打不开,程序也卡住了。

我该怎么解决这个问题呢?

2 个回答

0

如果你在使用 Tkinter(Python 2.x 或 3.x)的时候,同时用到了 .grid().pack(),那么 Tkinter 会一直努力尝试找到一个方法来同时满足这两种布局方式,这样会让你很头疼。你必须在同一个窗口或框架中只使用其中一种布局方式。

2

我稍微修改了一下你的代码:

from tkinter import * # for python 2.7 use Tkinter

root = Tk()


frame1 = Frame(root, bg='red', height=20)
frame1.grid(row=0,column=0, sticky=W+E)

frame3 = Frame(root, bg='blue', height=20)
frame3.grid(row=0,column=1, sticky=W+E)

frame2 = Frame(root, bg='green',  height=20)
frame2.grid(row=1,column=0, sticky=W+E)



frame4 = Frame(root)
frame4.grid(row=2,columnspan=2, sticky=E+W)

l5 = Label(frame4, text='Output:', bg='orange').grid(row=0, column=0, sticky=E+W)
output = Listbox(frame4, height=5, width=50)
output.grid(row=1,column=0)
#output.pack(side=LEFT,  fill=BOTH, expand=1)

root.mainloop()

这样做的结果是:

在这里输入图片描述

简单来说,我做的就是给框架和标签添加了 bgheightsticky 这些参数,这样可以更清楚地看到发生了什么,以及这些框架是如何排列的。此外,我还修改了列表框和标签的 grid 参数。

希望这能符合你的需求,或者能帮助你达到目标。

撰写回答