这是tkinter中糟糕的编程习惯吗?

时间:2014-08-22 19:15:07

标签: python user-interface tkinter

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

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

我有3个问题:

  1. 以这种更简单的方式进行编程是不是很糟糕?

  2. 如果我定义了一个类,并且回调函数绑定到小部件,那么这些函数都必须在类本身内吗?即我可以在课程中有一个按 go 的按钮,当我点击它时会运行一个在课堂外定义的复杂程序吗?

  3. 然后在课堂外生成结果并将其显示在其中是不好的做法?

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

3 个答案:

答案 0 :(得分:1)

  1. 一般来说是的......对于较小的程序来说,这可能不会太成问题,但随着复杂性的增加,把事情合并到类中会很好
  2. 不是真的......(全局变量往往是不好的做法......)但你描述的是消息封装和传递

答案 1 :(得分:1)

1)我想说这个例子,它不一定是错的。该程序运行。真正的担心是,当您开始制作更复杂的程序时,您可能需要更结构化的格式。课程可以提供帮助。

2)这些功能并非都必须在班级内。方法可以调用外部函数。拥有一个方法而不是一个函数的主要原因是该方法可以随时访问所有对象的属性。您希望避免函数到达对象内部来操纵属性。

3)最好将变量传递给一个类而不是定义全局变量,主要是因为它很难维持范围。

答案 2 :(得分:1)

  1. 当您的应用程序变大时,您将需要使用类。您可以一次专注于一门课程,而不必整理整个代码。
  2. 您不仅限于使用类中的方法。您的代码可以使用外部函数或类来获取信息,甚至可以修改赋予它们的参数。
  3. 不,那可能是显示信息的方式。或者,您可以使用文件输出结果,如果存在,可以打印到控制台。
  4. 示例:

    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 classmethod:

    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()