前言

  windows 的本地目录映射为磁盘的操作貌似没有图形化界面。
  windows 下只能映射网络路径。

alt

  当然,可以通过命令行 subst 来实现这样的功能。
  刚好工作上有人给我提了这个需求,因此我就做了图形化界面来简化操作。

  最开始我是打算使用 PyQt 进行开发的,但是打包之前大小有点太大了。
  一个简单的图形程序超过 10M 就有点过分了。
  所以后面我又去学习 Tkinter 开发,来减少程序的大小。
  Tkinter 是 Python 自带的跨平台图形界面开发库,开发起来虽然没有 Qt 那么方便(QtDesigner 是真的香),不过 Qt 的各种功能大都能在 Tkinter 实现。
  只是 Tkinter 的UI组装方式和 Qt 有些许差别。

  开发的界面我已经放到 Github 上 链接

Tkinter GUI 开发

  前段时间弄 mini_maya 的时候就接触过了 Tkinter 的开发,有 Qt 的开发背景,其实学起来还是很快的。
  不过 Tkinter 学习也遇到了不少的坑。

  Tkinter 最大的坑在于文档非常不全面,很多方法有什么参数不知道哪里查,只能在 Stack overflow 上找程序案例。

  Tkinter 没有 Qt 的 Layout 概念
  所有的组件都会继承三种不同的排列方法, place grid pack

  place 指定到 GUI 的任意位置,位置相对于组件的父对象而言,不使用二维坐标,而是使用 0-1 的百分比。
  grid 就和 Qt 的 QGridLayout 差不多
  pack 就类似 QVBoxLayout 和 QHBoxLayout 的结合体,通过 side 参数来定义嵌入的方式。

  Tkinter 的 Frame 就相当于 Qt 的 QWidget 可以作为组件的容器。


  一开始 Tkinter 开发的坑在于没有 Layout 概念
  组件没有办法类似于 Qt 一样自动根据窗口大小进行拉伸,就像是 mel 语言写的窗口一样。
  后来发现其实并不是不能实现的。

  grid 方法有 sticky 参数可以传入 东西南北 来定义组件在 grid 的显示,比如传入 “WE” 就会在 grid 这一个单元格中适应横向的大小。
  grid的单元格缩放可以通过, row_configcolumn_config 进行调整。
  pack 也有 expandfill 参数实现类似于 Qt Layout 那样顶掉空白区域的效果。

  当然要实现类似 Qt 的效果操作起来就会麻烦一点。


  另外 Tkinter 开发让我最不适应的点就是没有最小大小的概念。
  在网上查了很多,还是没有办法实现大小的限制,如果缩放窗口最后会将所有的 GUI 塌陷隐藏。

alt

  后来 Stack Overflow 有个 Tkinter 的大神有提到。
  如果是单独成行的组件 可以用 pack
  如果是多个组件组装到一起的,建议用 grid
  grid可以起确保单元格没有缩放到消失。

alt

  目前为止还是没有办法实现固定组件的长宽,有点小遗憾
  虽然找到了可以后面设置组件长宽的方法,但是在 调整窗口大小的情况下 起不到固定长宽的目标。
  如果长宽调整输入的数值没有变化的话组件的长宽就不会跟着改变,即便加上 resize 时间回调也不起作用。

总结

  这次又进一步加深了我对 Tkinter 的了解,并且这次用上了类的概念进行开发,已经很接近 Qt 的开发的效果。
  下次可以考虑一下 WPF 或者 AutoHotkey 的图形开发,虽然是 Windows 平台独占的,但是相信大小可以更进一步减少。