使用`pack()`方法在tkinter中使元素居中于LabelFrame中。

huangapple go评论71阅读模式
英文:

how to use pack() method to center element in a LabelFrame in tkinter

问题

我在一个LabelFrame中定义了一些元素,我定义了LabelFrame的宽度和高度,并将pack_propagate设置为0。但当我打包我的内容时,标签框中的内容没有使用其高度。我想要将元素均匀分布在框架的高度上。这是否可能?

英文:

I defined a LabelFrame as a parent for some elements, I defined the width and the height of the LabelFrame and i set pack_propagate to 0

        self.parent.grid_rowconfigure(0, weight=1)
        self.parent.grid_columnconfigure(0, weight=1)
        self.parent.grid_rowconfigure(1, weight=1)
        self.parent.grid_columnconfigure(1, weight=1)

 # Déclaration des elements de "Tag NFC"
        self.tag_label = tk.LabelFrame(self.parent, text="Tag NFC",height=200,width=280,bg=self.background_color ,font=self.title_font)
        self.tag_label.grid(column=0,row=0,ipadx=10,ipady=10,padx=10,pady=10)
        self.tag_label.pack_propagate(0)
        
        self.uid_entry_label= tk.Label(self.tag_label, text="ID Utilisateur",bg=self.background_color,font=self.content_font)
        # self.uid_entry_label.grid(column= 0, row=0 )
        self.uid_entry_label.pack()
        
        self.uid_entry =  tk.Spinbox(self.tag_label,font=self.content_font)
        # self.uid_entry.grid(column= 0, row=1 )
        self.uid_entry.pack()
        
        self.key_entry_label= tk.Label(self.tag_label, text="Clé de chiffrement",bg=self.background_color,font=self.content_font)
        # self.key_entry_label.grid(column= 0, row=2 )
        self.key_entry_label.pack()
        
        self.key_entry = ttk.Combobox(self.tag_label,font=self.content_font)
        # self.key_entry.grid(column=0, row=3 )
        self.key_entry.pack()

but when i pack my content, the content in the label frame dont use the height of its
使用`pack()`方法在tkinter中使元素居中于LabelFrame中。

I want to spread the element equally across the height of the frame

Is it possible ?

答案1

得分: 1

我倾向于使用的解决方案是创建"容器" Frame 来组织小部件,这可以使整体的 pack 行为更加可预测。

在这里,我创建了两个新的 Frametop_itemsbottom_items,并设置它们的 pack 参数以使它们在 LabelFrame 中居中显示。

self.top_items = tk.Frame(self.tag_label, bg=self.background_color)
self.top_items.pack(expand=True, fill='x')

self.uid_entry_label = tk.Label(self.top_items, text="ID Utilisateur", bg=self.background_color, font=self.content_font)
self.uid_entry_label.pack()

self.uid_entry = tk.Spinbox(self.top_items, font=self.content_font)
self.uid_entry.pack()

self.bottom_items = tk.Frame(self.tag_label, bg=self.background_color)
self.bottom_items.pack(expand=True, fill='x')

self.key_entry_label = tk.Label(self.bottom_items, text="Clé de chiffrement", bg=self.background_color, font=self.content_font)
self.key_entry_label.pack()

self.key_entry = ttk.Combobox(self.bottom_items, font=self.content_font)
self.key_entry.pack()

请注意,_label_entry 小部件的母/父级相应地已更改!

作为一种附带说明,第二个标签/字段看起来有点太低。如果你想稍微向上挪动它一点,你可以在 bottom_items Frame 的底部添加一些 y 填充,像这样:

self.bottom_items.pack(expand=True, fill='x', pady=(0, 30))
英文:

A solution I tend to use is creating "container" Frames for groups of widgets, which makes the overall packing behavior more predictable.

Here, I've created two new Frames, top_items and bottom_items, and set their pack parameters to center them in the LabelFrame

self.top_items = tk.Frame(self.tag_label, bg=self.background_color)
self.top_items.pack(expand=True, fill='x')

self.uid_entry_label = tk.Label(self.top_items, text="ID Utilisateur",bg=self.background_color,font=self.content_font)
self.uid_entry_label.pack()

self.uid_entry = tk.Spinbox(self.top_items,font=self.content_font)
self.uid_entry.pack()

self.bottom_items = tk.Frame(self.tag_label, bg=self.background_color)
self.bottom_items.pack(expand=True, fill='x')

self.key_entry_label = tk.Label(self.bottom_items, text="Clé de chiffrement",bg=self.background_color,font=self.content_font)
self.key_entry_label.pack()

self.key_entry = ttk.Combobox(self.bottom_items,font=self.content_font)
self.key_entry.pack()

Note that the master/parent of the _label and _entry widgets has changed accordingly!

<hr>

As an aside, the second label/field looks a little too low to my eye. If you want to nudge it upwards a bit, you can add some y padding to the bottom side of the bottom_items Frame like this:

self.bottom_items.pack(expand=True, fill=&#39;x&#39;, pady=(0, 30))

答案2

得分: 0

> 但是当我打包我的内容时,标签框中的内容并不使用其高度。

> 我想要将元素均匀地分布在框架的高度上。

> 这可能吗?

  • 你不需要使用 grid_rowconfiguregrid_columnconfigure。它不会影响任何事情。
  • 你不需要指定 height=200, width=280tag_label.pack_propagate 会处理。
  • tag_label.pack_propagate 的索引设置为 1,而不是零。
  • 你可以使用 pack() 或者 grid()。这取决于你。至于我,我使用 pack()
英文:

> but when i pack my content, the content in the label frame dont use
> the height of its.

> I want to spread the element equally across the height of the frame
>
> Is it possible ?

  • You don't need grid_rowconfigure and grid_columnconfigure. It doesn't
    affect anything.
  • You don't need to specify height=200,width=280. The
    tag_label.pack_propagate will handle.
  • Set the tag_label.pack_propagate index to 1 instead of zero.
  • You can use pack() or grid(). It is up to you. As for me, I use pack().

Code:

self.tag_label = tk.LabelFrame(self.parent, text=&quot;Tag NFC&quot;,  bg=self.background_color)
self.tag_label.pack()
# self.tag_label.grid(column=0,row=0,ipadx=10,ipady=10,padx=10,pady=10)
self.tag_label.pack_propagate(1)

Screenshot:

使用`pack()`方法在tkinter中使元素居中于LabelFrame中。

huangapple
  • 本文由 发表于 2023年6月15日 04:55:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/76477472.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定