ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# Custom Widgets 在编写照片管理器时,我需要使用滚动画布来显示照片。我找不到滚动画布小部件的通用候选对象,但在网络上发现了几种可行的变体。因此,我实现了对用户设计的自定义小部件的支持,这些小部件可以在PAGE中进行操作,但需要用户提供Python实现。因此,如果我遗漏了某些内容,并且可以想到它的tkinter实现,则PAGE可以处理它。 PAGE将“自定义”小部件显示为带有标题“自定义小部件”的文本小部件,并且可以像放置任何其他小部件一样放置和调整大小。但是,由于尚未在PAGE中定义窗口小部件,因此谈论在属性编辑器中修改属性是没有意义的,除了“ variant”是在4.15中新增并在下面进行描述的。在4.15版中,属性编辑器不显示其他属性。所有其他属性必须在小部件定义代码中处理。生成的Python将其称为在支持模块中定义的类。为了允许在支持模块完成之前执行GUI,支持模块中包含以下行: ~~~ Custom = Frame ~~~ 然后,用户使用自己选择的,将其自定义窗口小部件的代码作为一个类插入,并在该代码后加上以下一行: ~~~ Custom = <class_name> ~~~ 这就是将您放置在GUI中的小部件与支持模块中的实现类代码链接起来的魔力。请参阅自定义小部件示例。 当然,自定义窗口小部件的Python实现可以在一个单独的Python模块中,该模块可以导入到支持模块中。 在版本4.15中,自定义小部件的概念已扩展了两种方式。首先,现在可以在GUI中包含多个自定义窗口小部件。 其次,在同一个GUI中也可能有不止一种自定义窗口小部件。本质上实现的是一个带有各种变体的Custom窗口小部件,每个变体都通过单独的用户提供的Python实现来实现。为此,PAGE为“自定义”窗口小部件赋予了新属性“变量”,可以像在其他任何窗口小部件中的任何其他属性一样在“属性编辑器”中对其进行修改。 variant属性创建一个单独的名称,以在GUI模块中使用,并与单独的Python小部件实现绑定。如果为属性指定了值(名称),则该值将附加到名称“自定义”后,并且在生成Python代码时,将使用扩展名作为类名。如果variant属性留空,则类名将像以前一样是“ Custom”。例如,如果为项目d中的小部件“ Custom1”指定了变量“ p”,为小部件“ Custom2”指定了变量“ q”,则在GUI模块“ d.py”中生成了以下几行: ~~~ self.Custom1 = d_support.Customp(top) self.Custom1.place(relx=0.35, rely=0.24, relheight=0.16, relwidth=0.21) self.Custom2 = d_support.Customq(top) self.Custom2.place(relx=0.42, rely=0.62, relheight=0.16, relwidth=0.21) ~~~ 并且在支持模块“ d_support.py”中生成以下内容: ~~~ Customp = Frame Customq = Frame ~~~ 用户将名称“ Custom\_p”和“ Custom\_q”更改为他或她希望使用的自定义窗口小部件类的名称,并且您已为其使用Python实现。 因此,在GUI中有两个不同的自定义小部件。 显然,自定义窗口小部件的数量不限于两个。 我敦促您仔细查看[ScrolledCheckedListBox]()示例,以查看使用Greg Walters编写的自定义小部件的绝佳示例。 Greg Walters也编写了广泛的自述文件。 此示例有一个自定义小部件和其他几个PAGE小部件。 将其视为名称问题。 在上面的代码段中,Customp是在支持模块中定义的Class的名称或同义词,Custom1是通过执行Customp类创建的对象或实例的名称。 如果希望在支持模块中操作Customp实例,则将该实例称为w.Custom1。 在支持模块中,该行: ~~~ Customp = Frame ~~~ 将类重命名为Frame,以便在生成GUI模块和支持模块时可以执行GUI模块,并且Customp小部件将显示为框架。 当您开始编写“真实的”支持模块以使用自己的“本地”窗口小部件时,可以替换上面的代码行,或使用以下代码: ~~~ Customp = Homegrown ~~~ 使用两行代码都可以,这相当于两次为Customp分配名称。 只要确保最后一行紧跟Frame即可。 在导入支持模块时执行分配,这是在实例化Customp类之前发生的,因此使用了预期的类定义Homegrown。