在TCL/TK中如何创建一个带有滚动条的“阻塞”窗口,其中包含一百个检查按钮

问题描述 投票:0回答:1

我阅读了文档,但我仍然无法猜测正确的策略,因为我找不到可以提供帮助的“高级”文档,因此我在不知道它是否是正确的策略的情况下重复使用东西。

我需要创建一个具有滚动条(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 个帧……它“智能”吗?或者有什么聪明的方法吗?

user-interface tcl tk-toolkit
1个回答
0
投票

我不是 100% 确定“阻止”是什么意思,但答案可能涉及

grab
,或者可能是
tk busy
。对全球抢夺要非常小心;如果您没有正确解锁,您可以将自己锁定在与他们的用户会话之外。 (本地抓取和繁忙的窗口不会造成这样的风险;破坏您自己的程序只是一种刺激。)还要注意,整体窗口管理器可能不会让您获得真正的全局抓取;因此,您可能无法获得真正的全局抓取。 Tk 可以要求一项,但不能强制批准该请求。

使检查按钮成为

canvas
的(间接)管理子级确实是使它们可滚动的最简单方法。对于数百个检查按钮来说,这是否是一个“好主意”……现在我有很多担忧。很容易向用户呈现过多的信息;他们可能认为自己想看到全部,但更有可能的是他们不再关注其中的大部分内容。


用什么代替?

我不记得

ttk::treeview

是否可以包含

checkbutton
孩子。也许您最好看看 tktable 或 tktreectrl 扩展的强大功能;我对这两者都没有做过太多工作,所以无法指导您,但 tktreectrl 有包含该功能的示例,因此它绝对是可能的。
    

© www.soinside.com 2019 - 2024. All rights reserved.