这是 tkinter 中的不良编程习惯吗?
- 2025-02-28 08:23:00
- admin 原创
- 73
问题描述:
我正在学习使用 tkinter 编写事件驱动程序,并使用 Fredrik Lundh 的出色教程。在其中,他提到最好为框架定义一个类(App),并将程序作为该类的实例运行,而不是仅仅启动它:
root = Tk()
w = Label(root, text = 'hello, world!')
w.pack()
root.mainloop()
我有 3 个问题:
以这种较简单的方式进行编程是否是一种不好的编程习惯?
如果我确实定义了一个类,并将回调函数绑定到小部件,那么所有函数是否都必须在类本身内?例如,我是否可以
go
在类内有一个按钮,当我单击它时,运行在类外定义的复杂例程?将生成的结果带到课堂之外并在课堂内部显示出来是不是不好的做法?
本质上,我可以通过跳入和跳出课程来使程序工作,但不确定这样做是否是不好的做法(例如全局变量)。
解决方案 1:
随着应用程序变得越来越大,您将需要使用类。您不必费心考虑整个代码,而是可以一次专注于一个类。
您不仅限于使用类中的方法。您的代码可以利用外部函数或类来获取信息,甚至修改提供给它们的参数。
不,这就是显示信息的方式。或者,您可以使用文件来输出结果,如果存在,则可能将其打印到控制台。
例子:
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:
一般来说是的...对于较小的程序来说,可能不会有太大问题,但随着复杂性的增加,最好将事物合并到类中
是的
不是真的......(全局变量往往是不好的做法......)但你所描述的是消息封装和传递
解决方案 3:
1) 我想说,对于这个例子,这并不一定是错的。程序可以运行。真正令人担心的是,当你开始编写更复杂的程序时,你可能需要一种更结构化的格式。课程可以提供帮助。
2) 函数不必全部位于类本身内。方法可以调用外部函数。使用方法而不是函数的主要原因是方法可以随时访问对象的所有属性。您希望避免函数进入对象内部来操纵属性。
3)将变量传递给类比定义全局变量更好,主要是因为维护范围会变得困难。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD