这是 tkinter 中的不良编程习惯吗?

2025-02-28 08:23:00
admin
原创
74
摘要:问题描述:我正在学习使用 tkinter 编写事件驱动程序,并使用 Fredrik Lundh 的出色教程。在其中,他提到最好为框架定义一个类(App),并将程序作为该类的实例运行,而不是仅仅启动它:root = Tk() w = Label(root, text = 'hello, world!') w.p...

问题描述:

我正在学习使用 tkinter 编写事件驱动程序,并使用 Fredrik Lundh 的出色教程。在其中,他提到最好为框架定义一个类(App),并将程序作为该类的实例运行,而不是仅仅启动它:

root = Tk()
w = Label(root, text = 'hello, world!')
w.pack()
root.mainloop()

我有 3 个问题:

  1. 以这种较简单的方式进行编程是否是一种不好的编程习惯?

  2. 如果我确实定义了一个类,并将回调函数绑定到小部件,那么所有函数是否都必须在类本身内?例如,我是否可以go在类内有一个按钮,当我单击它时,运行在类外定义的复杂例程?

  3. 将生成的结果带到课堂之外并在课堂内部显示出来是不是不好的做法?

本质上,我可以通过跳入和跳出课程来使程序工作,但不确定这样做是否是不好的做法(例如全局变量)。


解决方案 1:

  1. 随着应用程序变得越来越大,您将需要使用类。您不必费心考虑整个代码,而是可以一次专注于一个类。

  2. 您不仅限于使用类中的方法。您的代码可以利用外部函数或类来获取信息,甚至修改提供给它们的参数。

  3. 不,这就是显示信息的方式。或者,您可以使用文件来输出结果,如果存在,则可能将其打印到控制台。

例子:

import tkinter
import random

class Application(tkinter.Frame):

    @classmethod
    def main(cls):
        root = tkinter.Tk()
        frame = cls(root)
        frame.grid()
        root.mainloop()

    def __init__(self, master=None, cnf={}, **kw):
        super().__init__(master, cnf, **kw)
        self.w = tkinter.Label(self, text='Hello, world!')
        self.w.grid()
        self.v = tkinter.Button(self, text='Press Me', command=self.click)
        self.v.grid()
        self.u = tkinter.Button(self, text='Me Too!',
                                command=lambda: external_mutator(self.w))
        self.u.grid()

    def click(self):
        self.w['text'] = external_function(3)

def external_function(ndigits):
    return round(random.random(), ndigits)

def external_mutator(widget):
    widget['text'] = external_function(6)
    print('Hello to you too!')  # shown on console if present

if __name__ == '__main__':
    Application.main()

类方法的替代方法main

import tkinter
import random

class Main(tkinter.Tk):

    def __init__(self, screenName=None, baseName=None, className='Tk',
                 useTk=1, sync=0, use=None):
        super().__init__(screenName, baseName, className,
                         useTk, sync, use)
        frame = Application(self)
        frame.grid()
        self.mainloop()

class Application(tkinter.Frame):

    def __init__(self, master=None, cnf={}, **kw):
        super().__init__(master, cnf, **kw)
        self.w = tkinter.Label(self, text='Hello, world!')
        self.w.grid()
        self.v = tkinter.Button(self, text='Press Me', command=self.click)
        self.v.grid()
        self.u = tkinter.Button(self, text='Me Too!',
                                command=lambda: external_mutator(self.w))
        self.u.grid()

    def click(self):
        self.w['text'] = external_function(3)

def external_function(ndigits):
    return round(random.random(), ndigits)

def external_mutator(widget):
    widget['text'] = external_function(6)
    print('Hello to you too!')  # shown on console if present

if __name__ == '__main__':
    Main()

解决方案 2:

  1. 一般来说是的...对于较小的程序来说,可能不会有太大问题,但随着复杂性的增加,最好将事物合并到类中

  2. 是的

  3. 不是真的......(全局变量往往是不好的做法......)但你所描述的是消息封装和传递

解决方案 3:

1) 我想说,对于这个例子,这并不一定是错的。程序可以运行。真正令人担心的是,当你开始编写更复杂的程序时,你可能需要一种更结构化的格式。课程可以提供帮助。

2) 函数不必全部位于类本身内。方法可以调用外部函数。使用方法而不是函数的主要原因是方法可以随时访问对象的所有属性。您希望避免函数进入对象内部来操纵属性。

3)将变量传递给类比定义全局变量更好,主要是因为维护范围会变得困难。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2974  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1836  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   47  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   47  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   48  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用