Why does the 'ipady' option in the tkinter.grid() method only add space below a widget?
Below is a code to show the issue. Label1
shows that I need to use pady
to displace Label1
by 10 pixels. Label2
shows the default effect of ipady
. Why does ipady
not leave space above and below the widgets? How do I get ipady
to do what it is suppose to do w/o using pady
? Thank you.
Quoting tcl documentation:
-ipady amount
The amount specifies how much vertical internal padding to leave on the top and bottom of the slave(s). This space is added
inside the slave(s) border. The amount defaults to 0.
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
s = ttk.Style()
s.configure('one.TFrame', background='light blue', relief='raised',borderwidth=10)
s.configure('two.TFrame', background='light green', relief='sunken', borderwidth=10)
frame1 = ttk.Frame(root,style='one.TFrame')
frame1.grid(row=0, column=0, sticky='nsew', ipady=10,)
label1 = ttk.Label(frame1, text='Label1')
label1.grid(sticky='nsew',padx=10, pady=10,)
frame2 = ttk.Frame(frame1,style='two.TFrame')
frame2.grid(row=1, column=1, sticky='nsew', ipady=50,)
label2 = ttk.Label(frame2, text='Label2')
label2.grid()
python tkinter grid-layout
add a comment |
Below is a code to show the issue. Label1
shows that I need to use pady
to displace Label1
by 10 pixels. Label2
shows the default effect of ipady
. Why does ipady
not leave space above and below the widgets? How do I get ipady
to do what it is suppose to do w/o using pady
? Thank you.
Quoting tcl documentation:
-ipady amount
The amount specifies how much vertical internal padding to leave on the top and bottom of the slave(s). This space is added
inside the slave(s) border. The amount defaults to 0.
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
s = ttk.Style()
s.configure('one.TFrame', background='light blue', relief='raised',borderwidth=10)
s.configure('two.TFrame', background='light green', relief='sunken', borderwidth=10)
frame1 = ttk.Frame(root,style='one.TFrame')
frame1.grid(row=0, column=0, sticky='nsew', ipady=10,)
label1 = ttk.Label(frame1, text='Label1')
label1.grid(sticky='nsew',padx=10, pady=10,)
frame2 = ttk.Frame(frame1,style='two.TFrame')
frame2.grid(row=1, column=1, sticky='nsew', ipady=50,)
label2 = ttk.Label(frame2, text='Label2')
label2.grid()
python tkinter grid-layout
add a comment |
Below is a code to show the issue. Label1
shows that I need to use pady
to displace Label1
by 10 pixels. Label2
shows the default effect of ipady
. Why does ipady
not leave space above and below the widgets? How do I get ipady
to do what it is suppose to do w/o using pady
? Thank you.
Quoting tcl documentation:
-ipady amount
The amount specifies how much vertical internal padding to leave on the top and bottom of the slave(s). This space is added
inside the slave(s) border. The amount defaults to 0.
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
s = ttk.Style()
s.configure('one.TFrame', background='light blue', relief='raised',borderwidth=10)
s.configure('two.TFrame', background='light green', relief='sunken', borderwidth=10)
frame1 = ttk.Frame(root,style='one.TFrame')
frame1.grid(row=0, column=0, sticky='nsew', ipady=10,)
label1 = ttk.Label(frame1, text='Label1')
label1.grid(sticky='nsew',padx=10, pady=10,)
frame2 = ttk.Frame(frame1,style='two.TFrame')
frame2.grid(row=1, column=1, sticky='nsew', ipady=50,)
label2 = ttk.Label(frame2, text='Label2')
label2.grid()
python tkinter grid-layout
Below is a code to show the issue. Label1
shows that I need to use pady
to displace Label1
by 10 pixels. Label2
shows the default effect of ipady
. Why does ipady
not leave space above and below the widgets? How do I get ipady
to do what it is suppose to do w/o using pady
? Thank you.
Quoting tcl documentation:
-ipady amount
The amount specifies how much vertical internal padding to leave on the top and bottom of the slave(s). This space is added
inside the slave(s) border. The amount defaults to 0.
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
s = ttk.Style()
s.configure('one.TFrame', background='light blue', relief='raised',borderwidth=10)
s.configure('two.TFrame', background='light green', relief='sunken', borderwidth=10)
frame1 = ttk.Frame(root,style='one.TFrame')
frame1.grid(row=0, column=0, sticky='nsew', ipady=10,)
label1 = ttk.Label(frame1, text='Label1')
label1.grid(sticky='nsew',padx=10, pady=10,)
frame2 = ttk.Frame(frame1,style='two.TFrame')
frame2.grid(row=1, column=1, sticky='nsew', ipady=50,)
label2 = ttk.Label(frame2, text='Label2')
label2.grid()
python tkinter grid-layout
python tkinter grid-layout
asked Jan 19 at 6:22
Sun BearSun Bear
1,647831
1,647831
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
I don't think ipady
quite does what you think it does. Admittedly, the documentation is a bit unclear on this point. It doesn't add the equivalent of an interior margin. Instead, it simply adds that many pixels to the height of the widget, and the pixels are added on the inside of the border rather than the outside. It doesn't "block off" these pixels from being used.
If your frame normally would be 20 pixels tall, with ipady=50
, your widget will now be 120 pixels tall (50*2 + 20). Any widgets added inside of this frame are able to use all of the space inside the frame. Thus, when you use grid
to place something in row zero, it will still appear at the very top of the frame, just below the border.
This is exactly what I see with your code. On my machine, frame2 without ipady=50
ends up being 20 pixels tall. When I add ipady=50
, the frame becomes 120 pixels tall. The label appears at the very top of the frame since it has been placed in row zero.
TL;DR: don't think of ipady as saying "I need this much of an inside margin", but rather "I need this much more extra space inside".
Thank you. In this case, the TCL documentation is erroneous and should be corrected to: The amount specifies the number of rows of pixel to extend the widget by. The amount defaults to 0. My suggestion.
– Sun Bear
Jan 19 at 12:34
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54264614%2fwhy-does-the-ipady-option-in-the-tkinter-grid-method-only-add-space-below-a%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I don't think ipady
quite does what you think it does. Admittedly, the documentation is a bit unclear on this point. It doesn't add the equivalent of an interior margin. Instead, it simply adds that many pixels to the height of the widget, and the pixels are added on the inside of the border rather than the outside. It doesn't "block off" these pixels from being used.
If your frame normally would be 20 pixels tall, with ipady=50
, your widget will now be 120 pixels tall (50*2 + 20). Any widgets added inside of this frame are able to use all of the space inside the frame. Thus, when you use grid
to place something in row zero, it will still appear at the very top of the frame, just below the border.
This is exactly what I see with your code. On my machine, frame2 without ipady=50
ends up being 20 pixels tall. When I add ipady=50
, the frame becomes 120 pixels tall. The label appears at the very top of the frame since it has been placed in row zero.
TL;DR: don't think of ipady as saying "I need this much of an inside margin", but rather "I need this much more extra space inside".
Thank you. In this case, the TCL documentation is erroneous and should be corrected to: The amount specifies the number of rows of pixel to extend the widget by. The amount defaults to 0. My suggestion.
– Sun Bear
Jan 19 at 12:34
add a comment |
I don't think ipady
quite does what you think it does. Admittedly, the documentation is a bit unclear on this point. It doesn't add the equivalent of an interior margin. Instead, it simply adds that many pixels to the height of the widget, and the pixels are added on the inside of the border rather than the outside. It doesn't "block off" these pixels from being used.
If your frame normally would be 20 pixels tall, with ipady=50
, your widget will now be 120 pixels tall (50*2 + 20). Any widgets added inside of this frame are able to use all of the space inside the frame. Thus, when you use grid
to place something in row zero, it will still appear at the very top of the frame, just below the border.
This is exactly what I see with your code. On my machine, frame2 without ipady=50
ends up being 20 pixels tall. When I add ipady=50
, the frame becomes 120 pixels tall. The label appears at the very top of the frame since it has been placed in row zero.
TL;DR: don't think of ipady as saying "I need this much of an inside margin", but rather "I need this much more extra space inside".
Thank you. In this case, the TCL documentation is erroneous and should be corrected to: The amount specifies the number of rows of pixel to extend the widget by. The amount defaults to 0. My suggestion.
– Sun Bear
Jan 19 at 12:34
add a comment |
I don't think ipady
quite does what you think it does. Admittedly, the documentation is a bit unclear on this point. It doesn't add the equivalent of an interior margin. Instead, it simply adds that many pixels to the height of the widget, and the pixels are added on the inside of the border rather than the outside. It doesn't "block off" these pixels from being used.
If your frame normally would be 20 pixels tall, with ipady=50
, your widget will now be 120 pixels tall (50*2 + 20). Any widgets added inside of this frame are able to use all of the space inside the frame. Thus, when you use grid
to place something in row zero, it will still appear at the very top of the frame, just below the border.
This is exactly what I see with your code. On my machine, frame2 without ipady=50
ends up being 20 pixels tall. When I add ipady=50
, the frame becomes 120 pixels tall. The label appears at the very top of the frame since it has been placed in row zero.
TL;DR: don't think of ipady as saying "I need this much of an inside margin", but rather "I need this much more extra space inside".
I don't think ipady
quite does what you think it does. Admittedly, the documentation is a bit unclear on this point. It doesn't add the equivalent of an interior margin. Instead, it simply adds that many pixels to the height of the widget, and the pixels are added on the inside of the border rather than the outside. It doesn't "block off" these pixels from being used.
If your frame normally would be 20 pixels tall, with ipady=50
, your widget will now be 120 pixels tall (50*2 + 20). Any widgets added inside of this frame are able to use all of the space inside the frame. Thus, when you use grid
to place something in row zero, it will still appear at the very top of the frame, just below the border.
This is exactly what I see with your code. On my machine, frame2 without ipady=50
ends up being 20 pixels tall. When I add ipady=50
, the frame becomes 120 pixels tall. The label appears at the very top of the frame since it has been placed in row zero.
TL;DR: don't think of ipady as saying "I need this much of an inside margin", but rather "I need this much more extra space inside".
answered Jan 19 at 7:12
Bryan OakleyBryan Oakley
216k22258420
216k22258420
Thank you. In this case, the TCL documentation is erroneous and should be corrected to: The amount specifies the number of rows of pixel to extend the widget by. The amount defaults to 0. My suggestion.
– Sun Bear
Jan 19 at 12:34
add a comment |
Thank you. In this case, the TCL documentation is erroneous and should be corrected to: The amount specifies the number of rows of pixel to extend the widget by. The amount defaults to 0. My suggestion.
– Sun Bear
Jan 19 at 12:34
Thank you. In this case, the TCL documentation is erroneous and should be corrected to: The amount specifies the number of rows of pixel to extend the widget by. The amount defaults to 0. My suggestion.
– Sun Bear
Jan 19 at 12:34
Thank you. In this case, the TCL documentation is erroneous and should be corrected to: The amount specifies the number of rows of pixel to extend the widget by. The amount defaults to 0. My suggestion.
– Sun Bear
Jan 19 at 12:34
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54264614%2fwhy-does-the-ipady-option-in-the-tkinter-grid-method-only-add-space-below-a%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown