Python Tkinter网格管理器和Entry Widg

2024-07-07 07:48:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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”如何位于“Confirm”按钮的旁边),但它却将其放置在Entry小部件结束的地方。

我知道这是一个网格管理问题。如何设置布局,使row=0,has text and entry widget,row=3有自己的独立列(0,1,2)用于按钮?


Tags: textmasterinputcolumnbutton按钮confirmcommand
4条回答

有可能不止一种方法来执行您想要的布局,我选择呈现一个干净的。您的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()

您的问题是Entrye1很长,包含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()

解决这个问题最简单的方法是拿一支铅笔和一些画纸。画出您想要小部件的位置,这将告诉您行、列、行跨度和列跨度选项需要什么值。

可能有不止一种方法来执行您想要的布局,我选择呈现一个干净的。您的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()

相关问题 更多 >