Python Tkinter网格管理器和输入小部件

3
这是我的代码目前的状态:
master = Tk()
Label(master, text="Input:").grid(row=0)

e1 = Entry(master, width = 100)
e1.grid(row=0, column=1)

Button(master, text='Q', command=q_pressed).grid(row=3, column=2,
                                                sticky=W, padx = 4, pady=4)

Button(master, text='C', command =c_input).grid(row=3, column=1,
                                                sticky=W, padx = 0, pady=4)

Button(master, text='Confirm', command=parse_input).grid(row=3, column=0,
                                                sticky=W, padx = 4, pady=4)

我试图让“Q”按钮与“C”按钮并排显示(就像“C”按钮在“确认”按钮旁边一样),但它会被放置在Entry小部件的位置。

我明白这是一个网格管理问题。我该如何设置布局,使得行=0的位置有文本和输入小部件,而行=3则有自己独立的列(0、1、2)来放置按钮?


第一行和第二行有什么内容? - mmgp
啊,那只是胡闹留下的残留物。对于我正在制作GUI的内容来说,这些行是不需要的。 - user1077071
3个回答

4
你的问题是Entry e1 很长,包含100个字符,但只跨越了一列。你可以使用columnspangrid命令中定义e1使用的列数。以下示例columnspan = 30适用于我。决定合理的columnspan值。
from Tkinter import *
master = Tk()
Label(master, text="Input:").grid(row=0)

e1 = Entry(master, width = 100)
e1.grid(row=0, column=1, columnspan=30)

Button(master, text='Q').grid(row=3, column=2)

Button(master, text='C').grid(row=3, column=1)

Button(master, text='Confirm').grid(row=3, column=0)
mainloop()

3
"columnspan"并不起作用,有关值“30”的建议是完全错误的。 - mmgp
我正在更深入地研究columnspan变量。为了学习更多,你知道如何在窗口中创建布局吗?例如,有三行。第一行和第三行只有两列,在第三行有三列,如果我要在第三行第一列添加一个按钮,它将自动居中于此区域。再次感谢。 - user1077071
我认为mmgp的答案也回答了这个问题。他的版本非常干净。其余部分就看你的创造力了。 - Holger

2
可能有多种方法可以实现您想要的布局,我选择呈现一个简洁的方法。您的Entry小部件占据了第一行第二列中的大量水平空间,因此在下一行放置小部件会给您带来麻烦。由于您知道下面将有3个按钮,因此您可以使此Entry跨越两列(使用columnspan=2进行网格化),并在网格化下一行时进行调整。但是我更喜欢另一种方法,这也可以产生更好的整体布局。您需要在第二行中网格化一个占用两列的Frame(因为在其上面的行中有两个小部件)。然后在此新的Frame上网格化您的按钮。

这将把您的代码转换为:

import Tkinter

master = Tkinter.Tk()

Tkinter.Label(master, text="Input:").grid(row=0, column=0)
Tkinter.Entry(master, width = 100).grid(row=0, column=1)

frame = Tkinter.Frame()
frame.grid(row=1, column=0, columnspan=2, sticky='w')
Tkinter.Button(frame, text='Confirm').grid(row=0, column=0, sticky='w')
Tkinter.Button(frame, text='C').grid(row=0, column=1, sticky='w')
Tkinter.Button(frame, text='Q').grid(row=0, column=2, sticky='w')

master.mainloop()

0

输入代码如下:{ master = Tk() Label(master, text="输入:" ).grid(row=0)

e1 = Entry(master, width=100)
e1.grid(row=0, column=1, columnspan=10)

Button(master, text='Q', width=5, command=q_pressed).grid(row=3, column=1, padx=0, ipadx=5, pady=4, sticky=E)

Button(master, text='C', width=5, command =c_input).grid(row=3, column=1, padx=0, ipadx=5, pady=4, sticky=W)

Button(master, text='Confirm', width=10, command=parse_input).grid(row=3, column=0, padx=0, pady=4, sticky=W)

mainloop()}

由于您需要输入字符串的长度为100个字符,因此我基于简单的数学除法将我的单元格/列宽设置为10。将我的列跨度设置为10。我去掉了padx,因为它涉及边框宽度,并使用ipadx,它涉及内部文本宽度。使输入框设置为10个字符宽的10个列。使用“input”文本作为1列。这将允许我使用10个字符或一个列来输入“confirm”文本,并且我可以通过使用width=5使按钮“c”和“q”变为5个字符宽,从而将第1列分成两半。然后通过使用justfy将“c”放在西侧,“q”放在东侧。

有很多方法,但这是我认为最简单的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接