Python Tkinter网格管理器和Entry Widget

时间:2013-01-01 21:16:35

标签: python tkinter

到目前为止,这是我的代码:

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小部件结束的位置。 / p>

我知道这是一个网格管理问题。如何设置布局使row = 0,有文本和条目小部件,row = 3有自己的独立列(0,1,2)用于按钮?

4 个答案:

答案 0 :(得分:3)

您的问题是Entry e1非常长且包含100个字符,但它只跨越一列。您可以使用columnspane1命令中定义grid的已使用列数。以下示例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()

答案 1 :(得分: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()

答案 2 :(得分:0)

解决这个问题的最简单方法是拿一支铅笔和一些方格纸。绘制出您想要的小部件的位置,这将告诉您行,列,rowspan和columnspan选项所需的值。

答案 3 :(得分:0)

在这里输入代码{master = Tk()     标签(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,用于简单的数学除法。将我的columnspan设置为10.我摆脱了padx,因为它属于边框宽度并使用了与内部文本宽度相关的ipadx。入门设置为10列宽10 char。使用"输入"文本为1列。这将允许我使用10个字符或一列用于文本"确认"我可以通过制作按钮" c"来打破第1列。 &安培; " Q" 5宽度使用宽度= 5。然后使用justfy put" c"西和" q"东

在我看来,这是最简单的方法。