0

我的主窗口启动一个带有子框架(用于浏览/选择目录)的顶级窗口以及底部的“加载”和“添加目录”按钮。“添加目录”按钮删除所有目录条目子框架(但保留按钮),检查没有输入的重复目录或空字符串,并为有效条目重新创建子框架并创建另一个留空。

问题是当我单击“添加目录”按钮时,按钮最终位于顶部。有没有办法将按钮固定到窗口底部?

在主类中:

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
4

1 回答 1

0

如果在网格化时没有指定将小部件放在哪一行,Tk 会选择编号比当前最大使用行号大一号的行。这通常很好,但对你来说是错误的。相反,您应该将按钮显式放置在具有大量数字(例如,1000)的行中,然后使用插入行的计数器来决定在哪个新显式行上进行插入。

+--------------------+
| 第 1 行 |
+--------------------+
| 第 2 行 |
+--------------------+
| 第 3 行 |
+--------------------+
| ... 空... |
+--------------------+
| 第 1000 行 |
+--------------------+

另一种选择是将按钮放在一个框架中,另一个内部框架包含您要添加行的网格空间。

+------------------------+
|+--------------------+|
|| 第 1 行 ||
|+--------------------+|
|| 第 2 行 ||
|+--------------------+|
|| 第 3 行 ||
|+--------------------+|
+------------------------+
| 按钮 |
+------------------------+

任何一种技术都会奏效。

于 2013-05-15T22:19:43.363 回答