I'm writing a simple UI with Tkinter and can't seem to find a mistake.
我正在用Tkinter编写一个简单的用户界面,似乎找不到错误。
Here is the outcome:
以下是结果:
And here is the code:
代码是这样的:
window = tkinter.Tk()
window.title("Password Manager")
window.configure(padx=20, pady=20)
canvas = tkinter.Canvas(window)
canvas.configure(width=200, height=200)
image = tkinter.PhotoImage(file="logo.png")
canvas.create_image(100, 100, image=image)
canvas.grid(row=0, column=1)
website_label = tkinter.Label(text="Website:")
website_label.grid(row=1, column=0)
website_input = tkinter.Entry(width=35)
website_input.grid(row=1, column=1, columnspan=2)
email_username_label = tkinter.Label(text="Email/Username:")
email_username_label.grid(row=2, column=0)
email_username_input = tkinter.Entry(width=35)
email_username_input.grid(row=2, column=1, columnspan=2)
password_label = tkinter.Label(text="Password:")
password_label.grid(row=3, column=0)
password_input = tkinter.Entry(width=21)
password_input.grid(row=3, column=1)
generate_password_button = tkinter.Button(text="Generate Password")
generate_password_button.config(width=14)
generate_password_button.grid(row=3, column=2)
add_button = tkinter.Button(text="Add", width=21)
add_button.grid(row=4, column=1, columnspan=2)
window.mainloop()
I expected my inputs and buttons to be correctly aligned, i.e. password input to go under upper inputs and generate password button to go right next, fitted to the end of upper inputs.
我希望我的输入和按钮正确对齐,即密码输入放在上面的输入下面,生成密码按钮放在右边,安装在上面的输入的结尾。
I also expected Add button to start in the beginning of the upper inputs.
我还期望添加按钮开始于上层输入的开始。
What am I missing?
我遗漏了什么?
更多回答
优秀答案推荐
By default, when using grid
the widgets will be centered in the row and column. That is what is happening here.
默认情况下,当使用网格时,小部件将在行和列中居中。这就是这里正在发生的事情。
The simplest solution is to add the sticky
attribute to each widget. That can be used to get the sides of a widget to "stick" to the sides of the row or column.
最简单的解决方案是将Sticky属性添加到每个小部件。这可以用来让小部件的侧面“粘”到行或列的侧面。
For example, add sticky="ew"
in the following statements (where "ew" stands for "east, west"):
例如,在以下语句中添加Sticky=“ew”(其中“ew”代表“East,West”):
website_input.grid(row=1, column=1, columnspan=2, sticky="ew")
email_username_input.grid(row=2, column=1, columnspan=2, sticky="ew")
password_input.grid(row=3, column=1, sticky="ew")
I personally think it's a best practice to always explicitly state the sticky
values for every widget.
我个人认为,最好总是明确说明每个小部件的粘性值。
更多回答
I think it would be a good idea to try to establish some kind of canonical about how to use .grid
properly. But I'm not qualified to phrase the question for it.
我认为尝试建立一些关于如何正确使用.grid的规范将是一个好主意。但我没有资格为这个问题措辞。
Thank you, Bryan, this worked like charm. Don't know why the course I'm taking never mentined it.
谢谢你,布莱恩,这招很管用。不知道为什么我所学的课程从来没有想到这一点。
我是一名优秀的程序员,十分优秀!