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

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

吕成业
2023-03-14
问题内容

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

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

我有3个问题:

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

  2. 如果我确实定义了一个类,并且将回调函数绑定到小部件,那么这些函数是否都必须在类本身内?即我可以go在班级内部使用一个按钮,当我单击该按钮时,它会运行一个在班级外​​部定义的详细例程吗?

  3. 然后将结果生成带到班外并在其中显示是不好的做法吗?

本质上,我可以通过跳入和跳出类而使程序正常工作,但是不确定这样做是否不好(全局变量)。


问题答案:
  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()


 类似资料:
  • 问题内容: 我经常看到有关不鼓励使用的其他问题的评论。为什么这样不好?有时我只是不在乎错误是什么,我只想继续编写代码。 为什么使用积木不好?是什么让它不好?是我pass出错还是我except出错了? 问题答案: 正如你正确猜到的那样,它有两个方面:通过在后面不指定任何异常类型来捕获任何错误,并在不采取任何操作的情况下简单地传递它。 我的解释要“长一点”,因此; 可以细分为: 不要发现任何错误。始终

  • 问题内容: 为什么捕获使用不被视为良好的编程习惯?什么是处理RuntimeException的正确方法? 另外,为什么不赶上?如何执行此行为? 问题答案: 通常,a 表示编程错误(在这种情况下,您无法“处理”该错误,因为如果您知道期望发生错误,则可以避免该错误)。 捕获任何这些常规异常(包括)都是一个坏主意,因为这意味着您声称自己了解所有可能出错的情况,尽管如此,您仍然可以继续。有时(而不是通常)

  • 问题内容: 我正在编写自己的容器,该容器需要通过属性调用来访问内部的字典。容器的典型用法如下: 我知道写这样的东西可能很愚蠢,但这就是我需要提供的功能。我正在考虑通过以下方式实现此目的: 我不确定嵌套的try / except块是否是一个好习惯,所以另一种方法是使用and : 或者使用其中之一,然后尝试使用catch块,如下所示: 哪个选项最适合pythonic和优雅? 问题答案: 您的第一个例子

  • 问题内容: 方法链接 是对象方法返回对象本身以使结果被另一个方法调用的实践。像这样: 这似乎被认为是一种好习惯,因为它会产生可读的代码或“流畅的界面”。但是,对我而言,它似乎打破了面向对象本身所隐含的对象调用表示法-生成的代码不代表对先前方法的结果执行的动作,通常这是面向对象的代码的工作方式: 这种差异设法为“调用结果对象”的点标记创建了两种不同的含义:在链接的上下文中,以上示例将被视为保存参与者

  • 问题内容: 关于Javadoc的内容不多。(简而言之:它返回字符串的规范表示形式,从而允许使用来比较内部字符串==) 我什么时候可以使用此功能? 是否存在Javadoc中未提及的副作用,即JIT编译器或多或少的优化? 还有其他用途吗? 问题答案: 我何时会使用此函数来支持String.equals() 当你需要速度时,因为可以按引用比较字符串(==比等于快) 是否有Javadoc中未提及的副作用?

  • 问题内容: 我听说捕捞是一种不好的做法,我认为这样做是明智的。让传播到顶部将允许检测出问题。但是很多时候我已经看到很多朋友直接被捕获,因此他们不必理会上面代码中可能发生的所有不同种类的异常。这是一个好习惯吗?还有哪些其他最好不处理的例外情况?此外,对我来说,处理一个确定了异常源的特定代码对我来说也很有意义。那么什么时候处理异常,什么时候不应该处理?最好不处理的异常清单可能是什么? 问题答案: 宠物

  • 问题内容: 我知道关键字存在于Java中。但是我不记得看到使用它的代码。可能我正在使用异常,并在本可以使用的地方登录。在Java中使用关键字是否是一种好习惯? 编辑 :我知道断言通常是一个好习惯。我的问题是,更准确地说,如果在Java中断言的BKM是使用关键字而不是使用异常,日志记录和其他技术。 问题答案: 不使用断言的主要原因是因为默认情况下未启用断言。因此,如果您的条件足够重要而需要断言,则不

  • 问题内容: 我正在开发一个相对较大的Python应用程序,因此我希望保留几种资源,因为可以在多个不同模块中访问全局变量。这些值包括版本号,版本日期,全局配置以及一些指向资源的静态路径。我还包括了一个由命令行选项设置的标志,以便我可以在调试模式下运行应用程序而无需整个环境。 我一直在谨慎地确保要导入的值在程序运行过程中不会发生变化,并且我已将它们记录为不应被触及的全局常量变量。我的代码本质上看起来像