- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 ttk.Notebook
和 grid
布局管理器布局两个相同的 ttk.Treeview
小部件时遇到问题。当我仅使用一个 TreeView (放置在标签框架中、放置在框架(部分)中、放置在另一个框架(主)中时,放置在 root 中),然后一切正常,我得到了想要的结果:
但是一旦我尝试将两个这样的 TreeView 放入笔记本中,一切都会变得困惑,即使我除了添加之外没有更改代码中的任何内容笔记本:
这是我根据the SO guidelines准备的代码为了更好地说明问题(我试图使其尽可能短,同时保留从中取出的应用程序的重要特征(如列布局和滚动条)):
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("App")
mainframe = ttk.Frame(root)
mainframe.grid()
section = ttk.Frame(mainframe, padding=(0, 0, 10, 60))
section.grid(sticky="nsew")
labelframe = ttk.Labelframe(section, text="Title", padding=(5, 7, 5, 13))
labelframe.grid(sticky="nsew")
# styles
style = ttk.Style()
style.configure(
"App.Treeview",
font=("TkDefaultFont", 8),
rowheight=15
)
style.configure(
"App.Treeview.Heading",
font=("TkDefaultFont", 8)
)
def build_tree(parent):
# treeview
trv = ttk.Treeview(parent)
trv.configure(
style="App.Treeview",
height=19,
columns=("#1", "#2", "#3", "#4"),
displaycolumns="#all",
selectmode="browse"
)
trv.grid(column=0, row=0, sticky="nsew")
# treeview's scrollbars
sbar_vertical = ttk.Scrollbar(parent, orient=tk.VERTICAL, command=trv.yview)
sbar_vertical.grid(column=1, row=0, sticky="ns")
sbar_horizontal = ttk.Scrollbar(parent, orient=tk.HORIZONTAL, command=trv.xview)
sbar_horizontal.grid(column=0, row=1, sticky="we")
trv.configure(yscrollcommand=sbar_vertical.set, xscrollcommand=sbar_horizontal.set)
# treeview's columns
trv.heading("#1", text="Name_1")
trv.heading("#2", text="Pos")
trv.heading("#3", text="NT/R")
trv.heading("#4", text="★")
trv.column("#0", stretch=True, minwidth=70, width=49)
trv.column("#1", stretch=True, minwidth=97, width=49)
trv.column("#2", stretch=True, minwidth=35, width=49)
trv.column("#3", stretch=True, minwidth=40, width=49, anchor=tk.E)
trv.column("#4", stretch=True, minwidth=12, width=49)
return trv
# tree = build_tree(labelframe)
# notebook
notebook = ttk.Notebook(labelframe)
tree1 = build_tree(notebook)
tree2 = build_tree(notebook)
notebook.add(tree1, text="One")
notebook.add(tree2, text="Two")
notebook.grid(sticky="nsew")
root.resizable(False, False)
root.mainloop()
要在第一个结果和第二个结果之间切换,只需取消注释
# tree = build_tree(labelframe)
划行并注释掉#notebook
部分。
我尝试在构造函数中提供笔记本 height
和 weight
选项参数,但没有任何改变,并且还尝试添加
rowconfigure(0, weight=1)
columnconfigure(0, weight=1)
到每个级别的容器(mainframe
、section
和 labelframe
),甚至全部到笔记本和 TreeView (即使据我所知,只有当窗口可调整大小时才需要这样做) - 获得完全相同的结果。
我的理解是,如果小部件放置在网格
中,而没有任何选项传递给grid()
调用,那么放置的小部件决定它需要多少空间,并且grid
管理器将给定列的宽度(或行的高度)容纳到小部件请求的最高值(在给定列或行中管理的所有值中) 。然后,如果这样确定的空间对于使用相同行/列的其他小部件来说太大,那么它就会被拉伸(stretch)(或者不会 - 主要根据粘性选项)。如果这种理解是正确的,那么我不太理解笔记本的行为,特别是当单独的 TreeView 似乎完全遵循它时。
我的环境:Ubuntu 17.10、Python 3.6.3、Tkinter 8.6。如果 TreeView 列的设置看起来有些奇怪 - 它源自 a comment to this question并且必须像这样才能使用水平滚动条。
最佳答案
问题是您尝试使用 grid
将滚动条和 TreeView 添加到笔记本,然后还使用笔记本的 add
方法添加它们。你不能将两者混为一谈。创建笔记本时,不应通过 pack
、place
或 grid
直接向其中添加小部件。
相反,每个笔记本选项卡应该是一个框架。然后,您可以使用 pack
、place
或 grid
将任何其他小部件放入该框架内。然后,您可以使用 add
将此框架添加到笔记本中。
因此,您的第一步是修改 build_tree
以创建并返回框架:
def build_tree(parent):
frame = ttk.Frame(frame)
...
return frame
接下来,您需要确保树和滚动条是该框架的子级,而不是笔记本的子级:
trv = ttk.Treeview(frame)
sbar_vertical = ttk.Scrollbar(frame, ...)
sbar_horizontal = ttk.Scrollbar(frame, ...)
根据经验,每当您使用网格
时,您应该始终为至少一行和一列赋予非零权重,以便它们增长和收缩以填充任何额外的空间。因此,请确保设置了该框架的行和列的权重。
例如:
def build_tree(parent):
...
frame.grid_rowconfigure(0, weight=1)
frame.grid_columnconfigure(0, weight=1)
...
现在,这将使笔记本的外观和行为与笔记本相关。
您与所有其他框架都存在类似的行/列权重问题,因此您需要将权重应用于每个具有由网格管理的子小部件的小部件。
关于python - 如何对包含两个 ttk Treeviews 的 ttk Notebook 进行网格化,以便它扩展以填充其指定的网格单元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48633394/
我有一个类似于以下的结构。 class A { string title; List bItem; } class B { int pric
本地流 和 远程流 两者都是“媒体流列表 ”。 本地流 包含“本地媒体流 ” 对象 但是,远程流 包含“媒体流 ” 对象 为什么差别这么大? 当我使用“本地流 “- 这个对我有用: localVide
我正在尝试将 8 列虚拟变量转换为 8 级排名的一列。 我试图用这个公式来做到这一点: =IF(OR(A1="1");"1";IF(OR(B1="1");"2";IF(OR(C1="1");"3";I
我正在使用面向对象编程在 Python 中创建一个有点复杂的棋盘游戏的实现。 我的问题是,许多这些对象应该能够与其他对象交互,即使它们不包含在其中。 例如Game是一个对象,其中包含PointTrac
有没有办法获取与 contains 语句匹配的最深元素? 基本上,如果我有嵌套的 div,我想要最后一个元素而不是父元素: Needle $("div:contains('Needle')")
出于某种原因,我无法在 Google 上找到答案!但是使用 SQL contains 函数我怎么能告诉它从字符串的开头开始,即我正在寻找等同于的全文 喜欢 'some_term%'。 我知道我可以使用
我正在尝试创建一个正则表达式来匹配具有 3 个或更多元音的字符串。 我试过这个: [aeiou]{3,} 但它仅在元音按顺序排列时才有效。有什么建议吗? 例如: 塞缪尔 -> 有效 琼 -> 无效 S
嘿所以我遇到了这样的情况,我从数据库中拉回一个客户,并通过包含的方式包含所有案例研究 return (from c in db.Clients.Include("CaseStudies")
如果关键字是子字符串,我无法弄清楚为什么这个函数不返回结果。 const string = 'cake'; const substring = 'cak'; console.log(string.in
我正在尝试将包含特定文本字符串的任何元素更改为红色。在我的示例中,我可以将子元素变为蓝色,但是我编写“替换我”行的方式有些不正确;红色不会发生变化。我注意到“contains”方法通常写为 :cont
我想问一下我是否可以要求/包含一个语法错误的文件,如果不能,则require/include返回一个值,这样我就知道所需/包含的文件存在语法错误并且不能被要求/包含? file.php语法错误 inc
我想为所有包含youtube链接的链接添加一个rel。 这就是我正在使用的东西-但它没有用。有任何想法吗? $('a [href:contains(“youtube.com”)]')。attr('re
我正在尝试在 Elasticsearch 中查询。除搜索中出现“/”外,此功能均正常运行。查询如下所示 GET styling_rules/product_line_filters/_search {
我正在开发名为eBookRepository的ASP.NET MVC应用程序,其中包含在线图书。 电子书具有自己的标题,作者等。因此,现在我正在尝试实现搜索机制。我必须使用Elasticsearch作
我已阅读Firebase Documentation并且不明白什么是 .contains()。 以下是文档中 Firebase 数据库的示例规则: { "rules": { "rooms"
我的问题是我可以给出条件[ 'BookTitleMaster.id' => $xtitid, ] 如下所示 $bbookinfs = $this->BookStockin->BookIssue->fi
我需要能够使用 | 检查模式在他们中。例如,对于像“dtest|test”这样的字符串,像 d*|*t 这样的表达式应该返回 true。 我不是正则表达式英雄,所以我只是尝试了一些事情,例如: Reg
我想创建一个正则表达式来不匹配某些单词... 我的字符:var test = "é123rr;and;ià456;or;456543" 我的正则表达式:test.match(\((?!and)(?!o
我在 XSLT 中有一个名为 variable_name 的变量,如果相关产品具有名称为 A 或 B 或两者均为 A & 的属性,我将尝试将其设置为 1 B.
您好,我想让接待员和经理能够查看工作类型和费率并随后进行更新。但是技术人员只能查看不能更新。该图是否有效? 我读到扩展用例是由发起基本用例的参与者发起的。我应该如何区分技术人员只能启动基本案例而不能启
我是一名优秀的程序员,十分优秀!