我阅读了文档,但我仍然无法猜测正确的策略,因为我找不到可以提供帮助的“高级”文档,因此我在不知道它是否是正确的策略的情况下重复使用东西。
我需要创建一个具有滚动条(x 和 y)的窗口,因为窗口的内容是一个可能包含数百个元素的复选框列表。
我需要这个窗口成为阻塞窗口(其他窗口和进程需要停止,因为这个窗口在这里)。这就是为什么首先我有一个对话框,但我无法在上面添加滚动条。
然后我发现不可能在对话框上添加滚动条,所以我现在有了这种窗口:
一个包含画布的框架,其中一个框架用于检查按钮列表,另一个框架用于按钮(确定、取消等)
简而言之:
$w.frAlles.c.frSimu => 上框架将会很大 $w.frAlles.c.frButtons => 底部框架
滚动条没问题,但是因为我需要将每个框架放置在画布中:
$w.frAlles.c create window 0 0 -anchor nw -window $w.frAlles.c.frSimu
$w.frAlles.c create window 200 650 -anchor c -window $w.frAlles.c.frButtons
然后,每个帧的大小受到限制,因为第二帧 frButtons 将放置在 200/650,而 frSimu 将无法尽可能长。
有没有办法配置框架,使 frSimu 位于 frButtons 上方,或者 frSimu 位于左侧,frButtons 位于右侧,但由于 frSimu 的大小可能很大,所以无法精确确定确切位置?
例如现在我有:
可选问题:有没有办法让现有的窗口成为“阻塞窗口”,这意味着只要用户不关闭此窗口,用户就无法执行任何操作?
可选问题2:我的GUI策略正确吗?我的意思是使用一帧,其中包含一张画布,然后是 2 个帧……它“智能”吗?或者有什么聪明的方法吗?
我不是 100% 确定“阻止”是什么意思,但答案可能涉及
grab
,或者可能是 tk busy
。对全球抢夺要非常小心;如果您没有正确解锁,您可以将自己锁定在与他们的用户会话之外。 (本地抓取和繁忙的窗口不会造成这样的风险;破坏您自己的程序只是一种刺激。)还要注意,整体窗口管理器可能不会让您获得真正的全局抓取;因此,您可能无法获得真正的全局抓取。 Tk 可以要求一项,但不能强制批准该请求。
使检查按钮成为
canvas
的(间接)管理子级确实是使它们可滚动的最简单方法。对于数百个检查按钮来说,这是否是一个“好主意”……现在我有很多担忧。很容易向用户呈现过多的信息;他们可能认为自己想看到全部,但更有可能的是他们不再关注其中的大部分内容。
我不记得
ttk::treeview
是否可以包含
checkbutton
孩子。也许您最好看看 tktable 或 tktreectrl 扩展的强大功能;我对这两者都没有做过太多工作,所以无法指导您,但 tktreectrl 有包含该功能的示例,因此它绝对是可能的。