ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 具有多个顶级Windows的应用程序 用户通常会希望构建具有多个顶层窗口的应用程序。 由于PAGE是为仅指定一个这样的窗口而建立的,用户如何进行? 我认为最好的方法是为每个顶级窗口创建单独的模块,并让主GUI的支持模块使用import语句将其导入。 然后可以使用模块中的创建功能来创建窗口。 此方法用于Vrex示例。 在这里,我使用PAGE为两个单独的程序GUI构造框架: * vrex GUI模块和关联的vrex_support模块。 vrex GUI模块是程序的主要模块。 * vrex_help GUI模块和关联的vrex_help_support模块。 我希望当在vrex GUI中选择“帮助”按钮时出现vrex_help GUI。 “帮助”按钮的命令是vrex_support.py中的帮助例程。因此,vrex_support.py中的以下代码将显示帮助窗口。 ~~~ import vrex_help def help(): vrex_help.create_Vrex_Help(root) ~~~ 当然,在这种情况下,两个程序之间的交互很少,从而简化了事情。 如下例所示,参数“ root”将帮助窗口绑定到主窗口。progress_bar示例中使用了相同的技术,该示例显示了窗口之间的更多交互,包括从主例程内部对进度条窗口的控制。 这两个模块是main.py和progress_bar.py。 在main.py中,我们有 ~~~ import progress_bar self.bar = progress_bar.create_Progress_Bar(root) ~~~ 在这里,参数root将两个窗口绑定在一起,并且创建例程返回Progress_Bar对象,该对象允许主GUI访问Progress_Bar对象的所有功能和属性,从而允许主GUI推进进度条并关闭进度 酒吧。在python代码中创建了特殊功能,以方便窗口的创建和销毁。 ~~~ w = None def create_New_Toplevel_1(root, *args, **kwargs): '''Starting point when module is imported by another program.''' global w, w_win, rt rt = root w = Toplevel (root) top = New_Toplevel_1 (w) unknown_support.init(w, top, *args, **kwargs) return (w, top) def destroy_New_Toplevel_1(): global w w.destroy() w = None ~~~ 可以使用围绕“ *args,**kwargs”用法构建的标准Python技术将可变数量的参数传递给支持模块的init函数。 例如,您可能有类似以下在双重示例中使用的代码: ~~~ p_dict_1 = {'geom': "+200+650", 'instance': 1, 'color' : 'firebrick'} p_dict_2 = {'geom': "+1000+650", 'instance': 2, 'color' : 'plum'} def open_two(): print "open_two starts" firebrick = called.create_Called(root,param=p_dict_1) plum = called.create_Called(root,param=p_dict_2) ~~~ 一个常见的问题是如何在模块之间共享全局变量。 一个很好的参考是如何在模块之间共享全局变量?如果您动态创建辅助窗口小部件并希望确保只有一个实例form2,则可以使用以下代码: ~~~ import form2 # If form2 already exists then destroy it and create it anew. I only want # one. So I play games with form2_w. global form2_w if 'form2_w' in globals() print 'its there' form2_w.destroy() (form2_w, form2_top) = form2.create_New_Toplevel(root) ~~~