Python-构造tkinter应用程序的最佳方法?

以下是我典型的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并在用户单击按钮1、2、3时funC打开另一个Toplevel带有窗口小部件的窗口。

我想知道这是否是编写python tkinter程序的正确方法吗?当然,即使我这样写也可以,但这是最好的方法吗?听起来很愚蠢,但是当我看到其他人编写的代码时,他们的代码并没有弄乱一堆函数,而且大多数情况下都有类。

有没有作为良好实践应遵循的特定结构?开始编写python程序之前,我应该如何计划?

我知道编程中没有最佳实践之类的东西,我也没有要求。在我自己学习Python时,我只想一些建议和解释就可以使我保持正确的方向。

回答:

我提倡一种面向对象的方法。这是我开始的模板:

# Use Tkinter for python 2, tkinter for python 3

import tkinter as tk

class MainApplication(tk.Frame):

def __init__(self, parent, *args, **kwargs):

tk.Frame.__init__(self, parent, *args, **kwargs)

self.parent = parent

<create the rest of your GUI here>

if __name__ == "__main__":

root = tk.Tk()

MainApplication(root).pack(side="top", fill="both", expand=True)

root.mainloop()

需要注意的重要事项是:

我不使用通配符导入。我将包导入为“ tk”,这要求我在所有命令前添加tk.。这样可以防止全局名称空间污染,并且在使用Tkinter类,ttk类或你自己的某些类时,使代码完全清晰可见。

主要应用是一类。这为你提供了所有回调和私有函数的私有命名空间,并且通常使组织代码更容易。在一种过程样式中,你必须自上而下进行编码,在使用它们之前定义函数等。使用此方法,你无需真正地在最后一步之前创建主窗口。我更喜欢继承,tk.Frame因为我通常从创建框架开始,但这并不是必须的。

如果你的应用还有其他顶级窗口,建议你将每个窗口都设为一个单独的类,并从继承tk.Toplevel。这为你提供了上述所有相同的优点-窗口是原子的,它们具有自己的名称空间,并且代码井井有条。另外,一旦代码开始变大,就可以很容易地将每个模块放入自己的模块中。

最后,你可能要考虑对接口的每个主要部分使用类。例如,如果要创建一个带有工具栏,导航窗格,状态栏和主区域的应用程序,则可以使每个类成为一个类。这使你的主要代码非常小,易于理解:

class Navbar(tk.Frame): ...

class Toolbar(tk.Frame): ...

class Statusbar(tk.Frame): ...

class Main(tk.Frame): ...

class MainApplication(tk.Frame):

def __init__(self, parent, *args, **kwargs):

tk.Frame.__init__(self, parent, *args, **kwargs)

self.statusbar = Statusbar(self, ...)

self.toolbar = Toolbar(self, ...)

self.navbar = Navbar(self, ...)

self.main = Main(self, ...)

self.statusbar.pack(side="bottom", fill="x")

self.toolbar.pack(side="top", fill="x")

self.navbar.pack(side="left", fill="y")

self.main.pack(side="right", fill="both", expand=True)

由于所有这些实例共享一个公共父对象,因此该父对象实际上成为了模型-视图-控制器体系结构的“控制器”部分。因此,例如,主窗口可以通过调用在状态栏上放置一些内容self.parent.statusbar.set(“Hello, world”)。这使你可以在组件之间定义一个简单的接口,从而有助于保持最小的耦合。

以上是 Python-构造tkinter应用程序的最佳方法? 的全部内容, 来源链接: utcz.com/qa/427670.html

回到顶部