我的主窗口启动一个顶层窗口,其中包含一个子框架(用于浏览/选择目录)以及底部的“加载”和“添加目录”按钮。 “添加目录”按钮删除所有目录条目子帧(但保留按钮),检查没有输入重复目录或空字符串,并重新创建有效条目的子帧,并创建另一个留空。
问题是,当我点击“添加目录”按钮时,按钮最终会显示在顶部。有没有办法将按钮固定在窗口的底部?
在大班:
def add_directory
dir_window = TkToplevel.new(@root) {title 'Directories'}
dir_frame = Tk::Tile::Frame.new(dir_window) {padding "3 3 12 12"}.grid(:sticky => 'nsew')
DirectoryFrame.show(dir_frame)
loadDirectoriesButtonClicked = proc {load_files}
Tk::Tile::Button.new(dir_frame) {text 'Load directories'; command loadDirectoriesButtonClicked}.grid(:column=>0, :sticky=>'s')
addDirButtonClicked = proc {DirectoryFrame.show(dir_frame)}
Tk::Tile::Button.new(dir_frame) {text '+'; width 2; command addDirButtonClicked}.grid(:column=>1, :sticky=>'sw')
end
在目录框架类中:
class DirectoryFrame < Tk::Tile::Frame
@@directory_frames = []
@@directories = []
def self.show(parent_frame)
if !(@@directory_frames.nil? || @@directory_frames.empty?)
directories
remove_frames(parent_frame)
end
@@directories.delete("")
if !(@@directories.nil? || @@directories.empty?)
@@directories.each do |dir|
dir_frame = DirectoryFrame.new(parent_frame)
dir_frame.directory = dir
@@directory_frames << dir_frame
end
end
@@directory_frames << DirectoryFrame.new(parent_frame)
refresh
end
def self.refresh
@@directory_frames.each_with_index do |dir_frame, index|
dir_frame.grid(:row=>index, :sticky=>'ew')
end
end
答案 0 :(得分:0)
如果在网格化时未指定要放置窗口小部件的行,则Tk会选择比当前最大使用行数大1的行。这通常很好,但对你来说是不对的。相反,你应该明确地将你的按钮放在一个大数字的行中(例如,1000),然后有一个插入行的计数器,用于决定哪些新显式行进行插入。
+--------------------+ | row 1 | +--------------------+ | row 2 | +--------------------+ | row 3 | +--------------------+ | ... empty ... | +--------------------+ | row 1000 | +--------------------+
另一种方法是将按钮放在另一个内部框架的框架中,该框架包含要添加行的网格空间。
+----------------------+ |+--------------------+| || row 1 || |+--------------------+| || row 2 || |+--------------------+| || row 3 || |+--------------------+| +----------------------+ | buttons | +----------------------+
这两种技术都可行。