在tkinter中制作窗口的哪种方式更好?

时间:2017-01-22 17:00:53

标签: python python-3.x user-interface tkinter

我已经看过两个关于使用Tkinter创建基本窗口的不同教程。其中一个教程使用带有函数的类来初始化和组装窗口。在另一个教程中,他们只是在不使用类或函数的情况下创建了一个窗口。

为了清楚起见,我不是在讨论Windows本身本身的内容。我只是想知道哪种方法更适合实现Tkinter。

如果这个解释没有意义,那么这里有两个代码。

如果这个解释没有意义,那么这里有两个代码。

代码#1使用类

from tkinter import *

class Window(Frame):

    def __init__(self, master=NONE):

        Frame.__init__(self, master)
        self.master = master

        self.init_window()

    def init_window(self):

        self.master.title("GUI")  #

        self.pack(fill = BOTH, expand=1)

        # We created a button below to see how to do it but commented it out for now.
        '''closeButton = Button(self, text='Close', command=self.client_exit)  # Making a new button called closeButton.

        closeButton.place(x=0, y=0)  # Places the button at given co-ordinates. (0,0) is top left. This isn't cartesian.'''

        menuBar = Menu(self.master)
        self.master.config(menu=menuBar)

        file = Menu(menuBar)
        file.add_command(label = 'Exit', command = self.client_exit)
        menuBar.add_cascade(label = 'File', menu=file)

        edit = Menu(menuBar)
        edit.add_command(label = 'Show Image', command = self.showImg)
        edit.add_command(label = 'Show Text', command = self.showTxt)
        menuBar.add_cascade(label = 'Edit', menu=edit)

    def showImg(self):
        load = Image.open('CatPic.jpg')
        render = ImageTk.PhotoImage(load)
        catImage = Label(self, image=render)
        catImage.image = render
        catImage.place(x=250, y=250)

    def showTxt(self):
        writeText = Label(self, text = "Hi I'm Temmie")
        writeText.pack()



root = Tk()  # Tk() is a function within Tkinter. 'root' is the name of our Frame.
root.geometry("500x500")  # Defines size of 'root'.
root.mainloop()

app = Window(root)  # Finally, we use the Window class to make a window under the name 'app'.

代码#2不使用此类概念

from tkinter import *
root=Tk()


topFrame = Frame(root)
topFrame.pack()
bottomFrame = Frame(root)
bottomFrame.pack(side=BOTTOM)

button1=Button(topFrame, text="Button 1", fg="red") #fg foreground is optional
button2=Button(topFrame, text="Button 2", fg="blue") #fg is optional
button3=Button(topFrame, text="Button 3", fg="green") #fg is optional
button4=Button(bottomFrame, text="Button 4", fg="black") #fg is optional

button1.pack(side=LEFT,fill=X)
button2.pack(side=LEFT)
button3.pack(side=LEFT)
button4.pack(side=BOTTOM)

root.mainloop()

2 个答案:

答案 0 :(得分:0)

这完全取决于你。

对于小例子,我主要使用的只是函数 - 写入速度更快 初学者会理解它 - 他们大多不了解课程。

对于更大的东西,我使用类 - 它使代码更清洁。

但我这样做不仅在Tkinter中,而且在其他模块中 - 比如PyGame。

答案 1 :(得分:0)

这两段代码基本上都在做同样的事情。第一部分将Frame作为基类,并使用默认参数和方法对其进行扩展,以便可以对您喜欢的窗口多次使用它。所以第一段代码就是普通的OOP项目如何使用tKinter,以便人们可以基本上修改所有内容并插入自己的代码,只要他们觉得tKinter缺乏或误导。同时,所有修改都可以轻松地用于其他项目(或其他窗口),如果您开始处理具有所有相同先决条件的另一个项目,那么您可以选择Window类并开始破解。

另一方面,更简单的解决方案充分利用了tTkinter提供的所有功能,这意味着您可以使用所有tKinter设置,参数等生成大量可自定义内容和几行代码。第二种解决方案不是那么容易重复使用,如果你想要它的某些部分,你不能只采用整个类定义,但必须选择修改窗口的行。此外,当您遇到必须覆盖tKinter内容的情况时,无论如何都需要创建自己的Window类。但话说回来,在大多数更简单的项目中都没有发生(我已经使用tKinter编写了项目,两者都有大约1500行,而且它们都不需要覆盖Frame类)。

所以TL; DR:
如果您是经验丰富的OOP开发人员,事先已经使用过各种框架等,我会选择第一个覆盖Frame类的解决方案。
如果 - 从问题看起来 - 你是一个想要开始并且看到结果的初学者而不是为了一个简单的项目而烦恼OOP怪癖和其他可能不必要的东西,我会去第二个和更轻的版本。

PS!永远不要使用from somepackage import *因为名称冲突,跟踪文件中的导入等等。相反,建议只使用import tkinter,然后您可以访问所有tKinter的内容tkinter.Frametkinter.Button等。另外一个好方法是将tKinter导入为{{ 1}},然后你可以将它用作import tkinter as tktk.Frame等等,总而言之,你必须少写。如果您只想使用套餐中的一个或两个组件,那么您通常会将其导入tk.Button,然后将其用作from tkinter import Button, FrameButton。希望这会有所帮助。