2017-01-22 5 views
1

私は、Tkinterを使って基本的なウィンドウを作るという2つのチュートリアルを見てきました。チュートリアルの1つは、関数を持つクラスを使用してウィンドウを初期化し、組み立てます。他のチュートリアルでは、クラスや関数を使わずにウィンドウを作成しました。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設定、パラメータなどを使用して、数行のコードでカスタマイズ可能なコンテンツを多数生成することができます。 2番目の解決策はそれほど簡単には再利用できないので、特定の部分が必要な場合は、クラス定義全体を取り上げるだけではなく、ウィンドウを変更する行を選択する必要があります。また、あなたがtKinterのものを上書きしなければならない状況になったときには、あなた自身のWindowクラスを作成する必要があります。しかし、やはり起こらないほとんどの単純なプロジェクトでは(私はtKinterを使ってプロジェクトに書きました。両方とも約1500行で、いずれもFrameクラスを上書きする必要はありませんでした)。

だから、TL; DR:
あなたが事前にフレームワークのすべての種類などを使用している経験豊富なOOPの開発者なら、私はFrameクラスをオーバーライドする最初の解決のために行くだろう。
もしあなたが初心者で、単純なプロジェクトのためにOOPの癖や他の間違いなく不必要なものを悩ますのではなく、結果を見たいと思っている初心者なら、私は第二のライターバージョン。

PS!名前の衝突、ファイル内のインポートのトラッキングなどのために、from somepackage import *を使用しないでください。代わりに、ちょうどimport tkinterを使用することが推奨されており、また、良い方法がimport tkinter as tkとしてTkinterのをインポートすることで、あなたは、あなたがすべてのすべてのあなたが持っているtk.Frametk.Buttonなどとして使用することができ、などtkinter.Frametkinter.ButtonとしてのTkinterのもののすべてにアクセスすることができますより少なく書く。パッケージから1つまたは2つのコンポーネントだけを使用する場合は、通常from tkinter import Button, Frameとしてインポートし、次にButtonFrameのように使用します。お役に立てれば。

+1

ありがとうございます。ほんとうにありがとう。本当にすべての疑問に答えました。 –

0

はそのような概念を使用していません。


小さな例では、ほとんどの機能のみを使用しています。書き込みは高速です。
初心者はそれを理解します - 彼らはほとんどクラスを知らない。

私はクラスを使用していますが、それはコードをきれいにします。

しかし私はTkinterだけでなく、PyGameのような他のモジュールでもこの​​ようにしています。

+0

フラワーありがとうございます。知っておいてよかった。 –

関連する問題