【问题标题】:Make NESTED tkinter frame widgets look like one frame使 NESTED tkinter 框架小部件看起来像一帧
【发布时间】:2018-08-22 22:05:39
【问题描述】:

有没有一种简单的方法可以让 嵌套 框架看起来像一个框架 - 最好使用网格布局管理器?当框架 嵌套时,这相对容易做到(即框架是 same 父窗口小部件的子级 - 请参阅第二张图片)。
问题是(1 像素?)之间出现的分离 帧。消除它,我的问题就消失了。

在第一幅图像中,三个垂直线,即嵌套框架的边缘边界,需要显示为一条线(同样适用于图像底部的水平线)。所需的结果是包含 3 个(子)帧的(父)帧 - 第二个图像。

我有这些嵌套框架:,但需要它们看起来像:

顺便说一句,所有三个子框架都是作为框架实现的,而不是按钮小部件。

我尝试过使用“padx”(零和负数)、“relief”(设置为 FLAT 等)和边框宽度(设置为 0 和 -1)小部件属性,但没有成功。

我不愿意重新设计应用程序(使用 Canvas 和/或 ttk.Separator)来解决这个小而烦人的问题。并且消除嵌套不是一种可接受的方法(除非绝对没有其他方法)。

有什么建议吗?

【问题讨论】:

  • 给我们看minimal reproducible example,这样我们就可以玩了。我猜最简单的解决方案是制作一个从嵌套转换为顺序的函数。
  • 完全嵌套是什么意思?除非绝对没有其他办法,否则您不想消除哪种嵌套?
  • Frame A 包含 Frame B,而 Frame B 又包含 Frame C。复杂性是通过将每个框架放置在它自己的(嵌套)函数中来管理的。 “取消嵌套”破坏了这种结构强制执行的模块化/隔离,使代码更难维护(你从一个干净的结构变成一个混乱的结构)。屏幕截图是每个框架中内容的极其简化的版本,这就是为什么易于维护/修改是基本要求的原因(例如,您可以通过将函数调用移动到新父级来将子框架移动到不同的父级)。

标签: python python-3.x tkinter overlay


【解决方案1】:

将内部框架的边框宽度设置为零,然后用ttk.Separator 将它们分隔开,即可获得所需的外观。

生成上图的代码:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.geometry("250x200")

outer_frame = tk.Frame(root, borderwidth=2, relief="groove")
outer_frame.pack(side="top", fill="both", expand=True, padx=20, pady=20)

f1 = tk.Frame(outer_frame, borderwidth=0, highlightthickness=0)
f2 = tk.Frame(outer_frame, borderwidth=0, highlightthickness=0)
f3 = tk.Frame(outer_frame, borderwidth=0, highlightthickness=0)

tk.Label(f1, text="Child Frame 1").pack(fill="both", expand=True)
tk.Label(f2, text="Child Frame 2").pack(fill="both", expand=True)
tk.Label(f3, text="Child Frame 3").pack(fill="both", expand=True)

s1 = ttk.Separator(outer_frame, orient="horizontal")
s2 = ttk.Separator(outer_frame, orient="horizontal")

f1.pack(side="top", fill="both", expand=True)
s1.pack(side="top", fill="x", expand=False)
f2.pack(side="top", fill="both", expand=True)
s2.pack(side="top", fill="x", expand=False)
f3.pack(side="top", fill="both", expand=True)

root.mainloop()

【讨论】:

  • 看起来我不能只使用基本的 tkinter 小部件来做我想做的事。我太执着于使用 .grid - 关键是在将子框架插入父框架时使用 .pack,
  • @user1459519:这取决于您所说的“仅基本的 tkinter 小部件”是什么意思。我看不出 ttk 有多“基本”。此外,您可以使用gridpack(甚至place)来获得相同的效果。我只是在示例中使用了pack,因为它需要更少的代码行,并且可以说是自上而下堆叠事物时的正确选择。
  • 基本我的意思是只使用“from tkinter import *”行。我让它使用网格工作。我的问题是在所有小部件上正确设置“'网格参数”(例如 columnconfigure()、rowconfigure()、padx、pady、sticky 等)的正确组合。顺便说一句,标准小部件在没有烦人的 3-D 阴影着色的情况下显示 1 像素边框应该是微不足道的。我想出的最好的方法是设置relief = RIDGE 和borderwidth = 1,但这似乎不适用于所有小部件。当然我不必使用 ttk.separtor 和“滚动我自己的”版本的标准小部件?
  • @user1459519:将浮雕设置为实心,边框宽度为 1 应该会给你一个像素边框。如果边框宽度为 1,则它不可能显示为带有阴影的 3D 对象。您还可以选择 1 像素高的画布,您可以分配任何您想要的颜色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2021-05-29
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多