微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

tkinter在框架上使用网格似乎不起作用

如何解决tkinter在框架上使用网格似乎不起作用

我正在尝试获取一个tkinter gui,以使用户登录tkinter确实很新。我做了一个框架,当我使用网格在框架内放置另一个框架小部件时,它是基于根而不是我认为正在发生的inner_frame进行的。在代码中,我做了一个灰色框来演示,但我不明白为什么它在蓝色框下方而不是在“登录”文本下方的黄色框内。感谢您的帮助。

from tkinter import *
root = Tk()
root.title("sighn in test")

#colors
background = "#273E47"
accent = "#d8973c"
red = "#bb4430"
white = "#edf2f4"

#this creates and places the background frame
main_buttons_frame = Frame(root,height = 500,width = 400,bg = background).grid(row = 0,column = 0)
#this creates and places the inner frame
inner_frame = Frame(main_buttons_frame,height = 450,width = 300,bg = accent).grid(row = 0,column = 0)
#this creates and places the "sighn in text"
top_text = Label(inner_frame,text = "sign in",font = ("helvitica",30,"bold"),bg = accent,fg =         
background).grid(row = 0,column = 0)
#this is a test to demonstrate
test_frame = Frame(inner_frame,bg = "grey",height = 100,width = 100).grid(row = 1,column = 0)


root.mainloop()

解决方法

初学者有一个很常见的错误

inner_frame = Frame(...).grid...()

因为None / inner_frame / grid()给出pack(),所以它将place()分配给None

所以以后Frame(inner_frame,..)的意思是Frame(None,..),它添加到root

您必须分两步进行

inner_frame = Frame(...)
inner_frame.grid(...)

现在您已将Frame分配给inner_frame


编辑:

通过正确分配的小部件,我得到

enter image description here

现在灰色框位于黄色框内,但是图像显示了不同的问题-grid() / pack()自动计算位置和尺寸,外部框自动更改尺寸以适合孩子的尺寸。

使用.grid_propagate(False)可以将其停止

enter image description here

但是它显示了其他问题-单元格未使用完整尺寸的父级,因此黄色框移至左上角,而不是居中:)空单元格具有width = 0heigh = 0,因此将所有单元格移至下一行和下一列将不会更改-它仍位于左上角:)

您需要将weight分配给决定如何使用可用空间的列和/或行。所有列/行都有weight=0,并且当您设置weight=1时,该行和/或列将使用所有可用空间-(这需要更好的解释)-然后单元格内的元素将居中。 / p>

 main_buttons_frame.grid_columnconfigure(0,weight=1)
 main_buttons_frame.grid_rowconfigure(0,weight=1)

enter image description here


import tkinter as tk # PEP8: `import *` is not preferred

# --- colors ---

background = "#273E47"
accent = "#d8973c"
red = "#bb4430"
white = "#edf2f4"

# --- main ---

root = tk.Tk()
root.title("sighn in test")

main_buttons_frame = tk.Frame(root,height=500,width=400,bg=background) # PEP8: without spaces around `=` inside `( )`
main_buttons_frame.grid(row=0,column=0)
#main_buttons_frame = None
main_buttons_frame.grid_propagate(False)
main_buttons_frame.grid_columnconfigure(0,weight=1)
main_buttons_frame.grid_rowconfigure(0,weight=1)

inner_frame = tk.Frame(main_buttons_frame,height=450,width=300,bg=accent)
inner_frame.grid(row=0,column=0)
#inner_frame = None
inner_frame.grid_propagate(False)
inner_frame.grid_columnconfigure(0,weight=1)
inner_frame.grid_rowconfigure(0,weight=1)

top_text = tk.Label(inner_frame,text="sign in",font=("helvitica",30,"bold"),bg=accent,fg=background)
top_text.grid(row=0,column=0,)
#top_text = None
#top_text.grid_propagate(False)
#top_text.grid_columnconfigure(0,weight=1)
#top_text.grid_rowconfigure(0,weight=1)

test_frame = tk.Frame(inner_frame,bg="grey",height=100,width=100)
test_frame.grid(row=1,column=0)
#test_frame = None
#test_frame.grid_propagate(False)
#test_frame.grid_columnconfigure(1,weight=1)
#test_frame.grid_rowconfigure(0,weight=1)

root.mainloop()

顺便说一句: PEP 8 -- Style Guide for Python Code

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。