2017-01-22 59 views
1

我已經看到了使用Tkinter製作基本窗口的兩個不同教程。其中一個教程使用具有函數的類來初始化和組裝窗口。在另一個教程中,他們只是在不使用類或函數的情況下創建了一個窗口。在tkinter中製作窗口的哪種方式比較好?

只是要清楚,我不是在說什麼窗戶本身。我只是想知道哪種方法更好地實施Tkinter。

如果解釋沒有意義,這裏是兩者的代碼。

如果解釋沒有意義,這裏是兩者的代碼。

CODE#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'. 

CODE#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() 
+1

「更好」是非常主觀的,相對於你正在編寫的程序的複雜性。可能會有關於這兩種方法的爭論。 –

+1

我不認爲它真的很重要,但你的第一個例子不起作用。在調用'mainloop'之後,你不能創建一個窗口,因爲在根窗口被銷燬之前'mainloop'不會返回。 –

+0

@BryanOakley謝謝,我爲自己修復了它。 –

回答

0

這兩段代碼都是在底層做基本相同的東西。第一部分將Frame作爲基類,並使用默認參數和方法對其進行擴展,以便它可以多次用於您喜歡的窗口。所以第一塊代碼是一個普通的OOP項目如何使用tKinter,以便基本上可以修改所有內容並插入他們自己的代碼,無論他們覺得tKinter是缺乏還是被誤導。同時,所有的修改都可以很容易地用於其他項目(或其他窗口),並且如果你開始另一個具有所有相同先決條件的項目,那麼你可以帶上你的Window類並開始破解。

在另一方面,簡單的解決方案充分利用所有tTkinter的提供出來,這意味着你可以生成大量的定製的內容用幾行代碼,使用所有Tkinter的設置,參數和包裝盒等的。第二種解決方案不容易重複使用,如果你需要某些部分,你不能只取整個類的定義,但必須選擇修改你的窗口的行。另外,當你遇到必須重寫tKinter的情況時,你需要創建自己的Window類。但是,再次,在大多數更簡單的項目中,這並沒有發生(我寫過使用tKinter的項目,它們大約有1500行,並且都不需要覆蓋Frame類)。

所以TL; DR:
如果你已經使用的各類框架等的事前,我會去的,它覆蓋Frame類的第一個解決方案有經驗的開發人員OOP。
如果 - 因爲它來自這個問題似乎是 - 你是誰想要得到去,看到一個結果,而不是與OOP怪癖和一個簡單的項目可以說是其他不必要的東西hassling初學者,我會去第二和打火機版。

PS!一個人不應該使用from somepackage import *,因爲名稱衝突,跟蹤文件中的導入等等。相反,我們建議只使用import tkinter然後就可以訪問所有的Tkinter的東西爲tkinter.Frametkinter.Button等也是不錯的方法是導入Tkinter的作爲import tkinter as tk,那麼你可以使用它作爲tk.Frametk.Button等和所有的一切,你有少寫。如果您只想使用包裝中的一個或兩個組件,那麼您通常會將它們導入爲from tkinter import Button, Frame,然後像ButtonFrame一樣使用它們。希望這可以幫助。

+1

非常感謝。對此,我真的非常感激。真的回答了我所有的疑問。 –

0

只取決於你。


對於小例子,我主要只使用函數 - 寫入速度更快。
初學者會理解它 - 他們大多不知道類。

對於更大的東西我使用類 - 它使代碼更清潔。

但我不這樣不僅在Tkinter的,而且在其他模塊 - 像pygame的。

+0

謝謝你furas。很高興知道。 –