2017-04-27 8 views
0

私はまず、ユーザが画像を取得するためのディレクトリの名前と、結果の.csvファイル(およびその他の情報)を保存する場所を記入する簡単なプロンプトウィンドウを作成します。 。Tkinterのクラス構造とレイアウトについてわからない

これを入力すると(この場合)、このプロンプトウィンドウを閉じて、メインウィンドウにすべての作業が表示されるようにします。

つまり、これはGUIのクラスを構造化する正しい方法ですか?また、次のような理由もあります。

frame = Frame(master, height=500,padx=20, pady=20) 

この初期ウィンドウの書式/レイアウトは変更されませんか?

この初期ウィンドウを作成する方法をしっかりと把握すれば、自分自身で残りの部分を続けるための適切な基盤ができます。

#imports 
from Tkinter import * 
import glob 
from PIL import Image, ImageTk 
#end imports 

class prompt_window: 

    def __init__(self, master): 

     frame = Frame(master, height=500,padx=20, pady=20) 

     #Build prompt window labels 
     self.source_label = Label(root, text="Source Directory") 
     self.destination_label = Label(root, text="Destination Directory") 
     self.region_sz_label = Label(root, text="Region Size") 
     self.save_file_name_label = Label(root, text="Save File Name") 

     #Build prompt window entry forms 
     self.source_entry = Entry(root) 
     self.destination_entry = Entry(root) 
     self.region_sz_entry = Entry(root) 
     self.save_file_name_entry = Entry(root) 

     #Build enter button 
     self.enter_button = Button(root, text="Enter") 

     #Align labels in prompt window grid 
     self.source_label.grid(row=0) 
     self.destination_label.grid(row=1) 
     self.region_sz_label.grid(row=2) 
     self.save_file_name_label.grid(row=3) 

     #Align entry forms in prompt window grid 
     self.source_entry.grid(row=0, column=1) 
     self.destination_entry.grid(row=1, column=1) 
     self.region_sz_entry.grid(row=2, column=1) 
     self.save_file_name_entry.grid(row=3, column=1) 

     #Add button 
     self.enter_button.grid(row=4,column=2) 

#create root 
root = Tk() 

#create prompt window 
prompt = prompt_window(root) 

#run indefinitely 
root.mainloop() 
+1

は '' frame'に()を '.grid、それはおそらく、代わりに' root'の他のウィジェットの最初の引数でなければなりません。 [PEP 8 - スタイルガイドfor Pythonコード](https://www.python.org/dev/peps/pep-0008/)に従って、クラスの名前を 'PromptWindow'に変更する必要があります。 – martineau

+0

@martineauフレームで.grid()を呼び出す必要がある理由と、それが適切な構造の維持にどのように関係しているのか説明できますか? –

+0

**コードがエラーなしで正常に動作し、パフォーマンスやコードに関する提案が必要な場合は、[CodeReview](https://codereview.stackexchange.com/)に質問を投稿できます。もちろん、投稿する前にツアーページを読んでください。 – Lafexlos

答えて

0

あなたはそれが見えるように、あなたのフレーム上のレイアウトのいずれかの方法(.pack.grid、または.place)を呼び出す必要があります。あなたのプログラムの私のバージョンでは、PEP-8スタイルのガイドに従うために、クラス名をprompt_windowからPromptWindowに変更しました。また、Tkinterのインポートステートメントを変更して、Tkinterのすべての名前で名前空間が乱雑にならないようにしました。

GUIコードの編成は、プレーンなCLIプログラムの編成とは少し異なります。すべてを定義したら、イベントに応答するのを待つループに座っています。このプログラムでは、プロンプトウィンドウを閉じるとメインウィンドウが開き、プロンプトウィンドウで収集されたデータにアクセスできるように設定する必要があります。

プロンプトウィンドウをメインウィンドウとは別のウィンドウにしたいので、ウィンドウを作成する必要があります。 Tkinterプログラムは1つのルートウィンドウしか持つことができないので、プロンプトフレームを保持するためにToplevelウィンドウを作成します。

ラベルを作成した後に何もしないので、ラベルをPromptWindowインスタンスの属性として保存する必要はありません。

私はEntryウィジェットをわずかに変更しました。データを保持するStringVarをそれぞれ与えました。これにより、プロンプトウィンドウを閉じた後にそのデータにアクセスすることができます。ウィジェットの親ウィンドウが閉じると、もうアクセスできなくなります。したがって、各エントリをPromptWindowの属性として保存する代わりに、関連するStringVarを代わりに保存します。

「Enter」ボタンを押すか、プロンプトウィンドウの閉じるウィジェットを押すと、プロンプトウィンドウを閉じてメインウィンドウを表示させます。

私は、プロンプトウィンドウで収集されたデータを印刷するためのボタンを含む簡単なMainWindowクラスを作成しました。あなたが呼び出す必要があります

import Tkinter as tk 

class PromptWindow(object): 
    def __init__(self, master): 
     self.master = master 
     self.win = tk.Toplevel(master) 
     self.win.title("Prompt Window") 

     # Intercept close window events so that when the user closes this window 
     # (via the close widget or the Enter button) the main window reopens 
     self.win.protocol("WM_DELETE_WINDOW", self.close) 

     frame = tk.Frame(self.win, height=500,padx=20, pady=20) 
     frame.pack() 

     # Build prompt window labels 
     tk.Label(frame, text="Source Directory").grid(row=0) 
     tk.Label(frame, text="Destination Directory").grid(row=1) 
     tk.Label(frame, text="Region Size").grid(row=2) 
     tk.Label(frame, text="Save File Name").grid(row=3) 

     # Build prompt window entry widgets 
     self.source = tk.StringVar() 
     tk.Entry(frame, textvariable=self.source).grid(row=0, column=1) 

     self.destination = tk.StringVar() 
     tk.Entry(frame, textvariable=self.destination).grid(row=1, column=1) 

     self.region_sz = tk.StringVar() 
     tk.Entry(frame, textvariable=self.region_sz).grid(row=2, column=1) 

     self.save_file_name = tk.StringVar() 
     tk.Entry(frame, textvariable=self.save_file_name).grid(row=3, column=1) 

     # Build enter button 
     tk.Button(frame, text="Enter", command=self.close).grid(row=4,column=2) 

    def close(self): 
     # Close this window 
     self.win.destroy() 
     # Reopen the main window 
     self.master.deiconify() 

class MainWindow(object): 
    def __init__(self): 
     # Create root window 
     root = tk.Tk() 
     # and make it invisible 
     root.withdraw() 
     root.title("Main Window") 

     # Add some widgets 
     tk.Label(root, text="This is the main window").pack() 
     tk.Button(root, text="Show data", command=self.show_data).pack() 

     # Create prompt window 
     self.prompt = PromptWindow(root) 

     # Loop forever 
     root.mainloop() 

    # Display the data gathered by the prompt window 
    def show_data(self): 
     prompt = self.prompt 
     src = prompt.source.get() 
     dest = prompt.destination.get() 
     region = prompt.region_sz.get() 
     fname = prompt.save_file_name.get() 

     fmt = 'src: {!r}, dest: {!r}, region: {!r}, fname: {!r}' 
     print(fmt.format(src, dest, region, fname)) 

MainWindow()