1. 问题背景
在使用tkinter编写事件驱动程序时,Fredrik Lundh的教程中提到,创建一个类(App)作为框架,并以类的实例运行程序,这样会更好,而不是直接启动程序。
以下是问题:
- 在tkinter中使用更简单的方式来编写事件驱动程序是否是一种不好的编程实践?
- 如果使用类来编写事件驱动程序,并且在类中绑定了回调函数,那么这些函数是否都必须在类中定义?也就是说,是否可以在类中定义一个按钮,当点击该按钮时,可以运行一个在类外定义的复杂函数?
- 是否可以将类外计算得到的结果显示在类内?
2. 解决方案
您将需要随着应用程序的增大而使用类。您不必费尽心思记住所有代码,而是可以一次专注于一个类。
- 您并不局限于只使用类中的方法。您的代码可以使用外部函数或类来获取信息,甚至可以修改给它们的参数。
- 不是的,这就是您可能会显示信息的方式。或者,您可以使用文件输出结果,如果存在控制台,还可以将其打印到控制台中。
代码示例:
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()