下面是我典型的python tkinter程序的整体结构。
def funA():
def funA1():
def funA12():
# stuff
def funA2():
# stuff
def funB():
def funB1():
# stuff
def funB2():
# stuff
def funC():
def funC1():
# stuff
def funC2():
# stuff
root = tk.Tk()
button1 = tk.Button(root, command=funA)
button1.pack()
button2 = tk.Button(root, command=funB)
button2.pack()
button3 = tk.Button(root, command=funC)
button3.pack()
funA
funB
and funC
will bring up another Toplevel
windows with widgets when user click on button 1, 2, 3.
我想知道这是否是编写 python tkinter 程序的正确方法?当然,即使我这样写它也会起作用,但这是最好的方法吗?这听起来很愚蠢,但是当我看到其他人编写的代码时,他们的代码并没有被一堆函数搞得一团糟,而且大部分都有类。
是否有任何我们应该遵循的特定结构作为良好做法?在开始编写 python 程序之前我应该如何计划?
我知道在编程中没有最佳实践这样的东西,我也没有要求它。我只是想要一些建议和解释,让我在自己学习 Python 的过程中保持正确的方向。
原文由 Chris Aung 发布,翻译遵循 CC BY-SA 4.0 许可协议
我提倡面向对象的方法。这是我开始使用的模板:
需要注意的重要事项是:
我不使用通配符导入。 我将包导入为“tk”,这要求我在所有命令前加上
tk.
前缀。这可以防止全局命名空间污染,此外,当您使用 Tkinter 类、ttk 类或您自己的一些类时,它会使代码完全显而易见。主要应用是一个类。这为您的所有回调和私有函数提供了一个私有名称空间,并且通常可以更轻松地组织您的代码。在程序风格中,您必须自上而下地编写代码,在使用它们之前定义函数等。使用这种方法您不需要,因为直到最后一步才真正创建主窗口。我更喜欢从
tk.Frame
继承,因为我通常从创建一个框架开始,但这绝不是必要的。如果您的应用程序有额外的顶层窗口,我建议将它们中的每一个都设为一个单独的类,继承自
tk.Toplevel
。这为您提供了上述所有相同的优势——窗口是原子的,它们有自己的名称空间,并且代码组织良好。另外,一旦代码开始变大,就可以很容易地将它们放入自己的模块中。最后,您可能要考虑为界面的每个主要部分使用类。例如,如果您正在创建一个带有工具栏、导航窗格、状态栏和主区域的应用程序,您可以创建这些类中的每一个。这使您的主要代码非常小且易于理解:
由于所有这些实例共享一个共同的父对象,因此父对象有效地成为模型-视图-控制器架构的“控制器”部分。因此,例如,主窗口可以通过调用
self.parent.statusbar.set("Hello, world")
在状态栏上放置一些东西。这允许您在组件之间定义一个简单的接口,有助于将耦合保持在最低限度。