🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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)中进一步探讨了其中一些功能。