当前位置: 首页 > 面试题库 >

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

蔡理
2023-03-14
问题内容

以下是我典型的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开发非平凡的最终用户桌面(非Web)应用程序。构造项目文件夹层次结构的最佳方法是什么? 理想的功能是易于维护,IDE友好,适用于源代码控制分支/合并以及易于生成安装软件包。 尤其是: 你将源放在哪里? 你将应用程序启动脚本放在哪里? 你将IDE项目放在哪里? 你将单元/验收测试放在哪里? 你将非Python数据(例如配置文件)放在哪里? 你在哪里将非Pyt

  • 问题内容: 为自定义PHP应用程序存储一组全局设置的最佳方法是什么?我正在做一个个人项目(实际上是第一个主要项目),并且需要一种存储键值对的方法来记录应用程序的整体设置。 东西存储为… 网站的全球名称。 主题(只是一个变量或主题的路径) 等等 我应该把它们放在一张桌子里吗?如果是这样,从boostrap查询它们的最佳方法是什么?除了对每个所需的设置执行单个查询。 更新:是的.ini或解析一个包含文

  • 问题内容: 我希望在学习快速的过程中开发一个库存/物品库存应用程序。它基本上是具有项目名称,数量和位置的东西。 例如。 25号工作货车灯泡 开关,6,仓库 当用户输入此数据并按下按钮时,什么是存储此数据并在以后检索的最佳方法。我知道我可以将此附加到数组并显示该数组,但是如果应用程序关闭,该怎么办? 我应该在学习数据库存储吗?我可以将数据保存到手机吗? 问题答案: 如果要存储的数据很少且不敏感,则可

  • 我是一个iOS开发人员,有一定的经验,这个问题对我来说真的很有趣。我看到了关于这个话题的很多不同的资源和材料,但尽管如此,我还是感到困惑。iOS联网应用的最佳架构是什么?我指的是基本的抽象框架,模式,它将适合每一个网络应用程序,无论是一个只有几个服务器请求的小应用程序,还是一个复杂的REST客户机。苹果建议将 作为所有iOS应用程序的基本架构方法,但无论是 还是更现代的 模式都没有说明将网络逻辑代

  • 问题内容: 有一些与此类似的话题,但是我找不到一个足够答案的话题。 我想知道Java中构造函数重载的最佳实践是什么。我已经对这个主题有自己的想法,但是我想听听更多的建议。 我既指的是简单类中的构造函数重载,也指继承已经重载的类时的构造函数重载(这意味着基类具有重载的构造函数)。 谢谢 :) 问题答案: 虽然没有“官方指南”,但我遵循KISS和DRY的原则。使重载的构造函数尽可能简单,最简单的方法是

  • 问题内容: Java是我选择的编程语言之一。尽管将应用程序分发给最终用户,但我总是遇到问题。 为用户提供JAR并不总是像我想要的那样友好,并且使用Java WebStart要求我维护Web服务器。 分发Java应用程序的最佳方法是什么?如果Java应用程序需要在用户计算机上安装工件,该怎么办?有没有好的Java安装/打包系统? 问题答案: 有多种解决方案,取决于你的发行要求。 只是用一个jar。这