[TOC]
# Module Structure
PAGE生成两个模块,即GUI模块和支持模块。 第一个包含将GUI窗口放到计算机屏幕上所需的所有Python代码。 在PAGE世界中,GUI模块是不可编辑的。 它包含到支持模块的所有必需链接。 通常,它是应用程序的主要模块。
支持模块以骨架形式生成,是构建应用程序的框架。 这是用户编写的代码所在的位置。 因此,它很少生成或被PAGE取代。 实际上,分离是返工的秘诀。 它可以在保留用户代码的同时更改GUI窗口的内容和外观。
生成模块时,它们会显示在Python控制台中,但不会自动保存。 这使用户有机会检查代码并决定是否保存。 PAGE生成模块时,它将使用四个空格进行缩进。 PAGE保存模块时,空格将另存为空格。
## Project Directory
包含与PAGE相关联的各种文件的目录称为项目目录。 它包含项目文件,生成的Python模块,与窗口小部件一起使用的任何图像文件以及任何应用程序支持模块。
让我将项目目录称为“ proj_dir”,因为它很精确并且对应于内部PAGE变量。 proj_dir设置有几种方法:
* 如果执行PAGE时不带参数,则proj_dir设置为当前工作目录。
* 如果使用参数调用PAGE,则proj_dir设置为连接到参数目录部分的当前工作目录。
* 如果保存了用PAGE创建的GUI设计,则目标目录将成为proj_dir。
* 如果打开了项目文件,则源目录将成为proj_dir。
当小部件具有图像属性时,这一点很重要。 为了使这种情况合理合理,PAGE要求与此类小部件关联的所有图像文件在指定小部件之前都位于proj_dir或其子目录中。
我建议在执行PAGE之前,创建一个目录并将该目录作为当前工作目录。 在开始GUI开发之前不必包含图像文件,而在小部件指定非空白图像属性之前需要包含图像文件。 同样,您可以添加可能包含图像的窗口小部件,但是必须在指定图像属性之前包含图像文件。
## GUI Module
GUI模块的主要功能是类定义,它定义了一个GUI窗口。 它定义了顶层窗口以及所有包含的窗口小部件。 请注意,它在支持模块中将所有回调函数都称为函数,而Tk变量(例如textvariables)在支持模块中被称为Tk变量。
GUI模块包含两个用于实例化窗口类的样式化函数。 第一个是:
~~~
def vp_start_gui():
'''模块作为主要例程的起点.'''
global val, w, root
root = Tk()
top = New_Toplevel_1 (root)
fnew_support.init(root, top)
root.mainloop()
~~~
这是将例程作为应用程序的主例程启动时的入口点,如模块底部所示:
~~~
if __name__ == '__main__':
vp_start_gui()
~~~
函数vp_start_gui的主要功能是它初始化Tk并建立Tkinter主循环。 请注意,支持模块中的init函数传递给GUI窗口类的指针。
另一个功能是:
~~~
def create_New_Toplevel_1(root, *args, **kwargs):
'''模块被另一个程序导入的起点'''
global w, w_win, rt
rt = root
w = Toplevel (root)
top = New_Toplevel_1 (w)
fnew_support.init(w, top, *args, **kwargs)
return (w, top)
~~~
例如,如果需要在主GUI中触发某些辅助GUI(例如进度条),则从正在运行的应用程序中的代码中调用ate GUI窗口时,这是入口点。 注意,它不会调用Tk()也不启动主循环。 您只想要其中之一。 重要的一点是,以灵活性的名义向init函数传递了一个变量参数列表。 它还将传递一个指向GUI窗口的指针。 这样做是为了使用户可以在其支持模块中关闭创建的窗口,而不会关闭影响应用程序中的其他窗口。
## Support Module
该模块位于应用程序的手工编码部分。 显然,PAGE只能为应用程序准备框架。 PAGE知道的是,(1)GUI模块和支持模块之间的链接,(2)要位于支持模块中的回调函数,以及(3)要在支持模块中操作的Tk变量。
对于模块之间的链接主要是init函数。
~~~
def init(top, gui, *args, **kwargs):
global w, top_level, root
w = gui
top_level = top
root = top
~~~
在这里PAGE仅产生了最低要求。 它设置全局变量,该全局变量引用GUI窗口的根,而w指向由相应的GUI模块创建的GUI窗口。 后者允许用户更改GUI窗口以及该窗口中包含的窗口小部件的配置。 例如,如果GUI窗口中有一个按钮(Button1),则只需使用以下代码即可在支持模块中的任何位置更改颜色:
~~~
w.Button1.configure(color='red')
~~~
同样,如果有模块或例程的层次结构从支持模块流出,则可以传递和操纵对GUI窗口的引用。
为回调函数生成的代码更加简单:
~~~
def callback():
print('unknown_support.callback')
sys.stdout.flush()
~~~
为Tk变量kkkk生成的代码如下:
~~~
def set_Tk_var():
# 这些是传递给Tkinter的Tk变量
# 必须在创建使用它们的窗口小部件之前进行定义
global kkkk
kkkk = StringVar()
~~~
这样生成的代码被生成为使得GUI模块和支持模块将是可执行对。 也就是说,即使没有添加其他应用程序代码,也可以执行GUI模块并查看其外观。 如果GUI调用了回调(例如通过按钮选择),程序将告诉您它已被调用。 现在您有了准备,开始编程。
如果在编写了大量的应用程序代码之后发现在GUI模块中需要附加的小部件,该怎么办? 该怎么办?
首先使用项目名称调用PAGE,添加具有所有配置的小部件,包括回调和Tk变量。 然后像以前一样为GUI模块生成Python代码。 您确定不想重新构建支持模块并擦除所有手码。 因此,当您告诉PAGE生成支持模块时,它将为您提供更新现有支持模块的选项。 如果选中,PAGE将仅为新的回调添加框架并添加新的Tk变量。 此外,如果出现故障或PAGE错误,它将备份模块的先前版本。 等等。PAGE将使备份保持在首选项中指定的深度。 请参阅[备份首选项](preferences.md).
为方便起见,在支持模块的底部添加了以下代码,以帮助调试。 如果您正在调试支持模块并想要测试其执行情况,则只需执行它即可,它不会首先通过调用支持模块中的功能,而是通过GUI模块中的主要功能来启动。 我发现它特别有用,因为我是在emacs中进行开发的,在那里我有一个按键绑定,它将调用python来执行当前缓冲区。
~~~
if __name__ == '__main__':
import bind_example
bind_example.vp_start_gui()
~~~
[具有多个顶层Windows的应用程序](use.md)中进一步探讨了其中一些功能。
- 介绍
- 更新记录
- X Concepts
- Visual Tcl
- 使用PAGE设计范例
- 项目目录配置
- Python 2 or Python 3
- Python编码和UTF-8
- 使用PAGE的简短说明
- PAGE的状态
- 安装
- PAGE界面
- 主菜单
- 子菜单
- 组件工具栏
- 属性编辑器
- 组件树
- 绑定操作窗口
- 菜单编辑器
- 首选项窗口
- Python控制台
- 回调窗口
- 应用窗口
- 颜色对话框
- 颜色
- 双显示器
- 默认值和首选项
- Preferences Windows
- Color Preferences
- Font Preferences
- 模块结构
- 风格和主题
- 使用PAGE
- 命名约定
- 概述
- Toplevel Geometry
- 别名
- 气球帮助-工具提示
- 选择和修改组件
- 修改组件位置和尺寸
- 锁定组件
- 填充容器
- 剪切,复制和粘贴
- Stash and Apply - Propagate Widget Options
- 菜单组件
- 回调函数
- 将事件链接到回调函数
- 创建绑定
- 为滚动组件创建绑定
- 定义回调函数
- 查看回调
- 指定字体
- Toplevel Widget
- 相对位置
- Tkinter变量类
- Ttk Widgets
- Scrolled Widgets
- Ttk Notebook and PNotebook
- Ttk Panedwindow
- Ttk Treeview
- Entry
- Ttk Entry
- Ttk Combobox
- Radiobuttons
- 文本和变量的奇异性
- Label
- Listbox
- Spinbox
- Scale and TScale
- TSeparator
- Sizegrip
- Custom Widgets
- Canvas
- 生成,检查和运行Python GUI
- 创建和保存代码模块
- 检查生成的Python模块
- 执行Python模块
- 将生成的Python模块加载到IDE中
- 具有多个顶级Windows的应用程序
- 修改光标
- 使用图像
- 动态组件
- 菜单
- 重建
- 自动更新支持模块
- 重用
- 模板
- 从现有项目中借用组件
- 范例
- 结语