74552
PythonにてGUIを作成中で上手くいかない点があるため、質問させていただきます。

以下のようなコードを作成し、`input_label1` で参照した複数ファイルを合算し、`input_label2` と `input_label3`
で入力した値を使用し、解析したいと考えています。

しかし、`name 'file_select' is not defined` というエラーが発生します。  
`def init_star(self):`
と同じインデントにする必要があるというのはわかるのですが、そうすると、GUIにボタンや入力ボックスが表示されなくなります。

どなたかご教授いただけないでしょうか？よろしくお願いいたします。

```

    import tkinter
    from tkinter import filedialog
    import pydicom
    
    import os
    import pydicom
    import matplotlib.pyplot as plt
    from pylinac import Starshot
    
    class Gui():
    
      def init_star(self): 
     
    #画像の合算      
        def file_select():
                      idir = r"C:\Users\tanim\OneDrive\デスクトップ"
                      file_path = tkinter.filedialog.askdirectory(initialdir = idir)
                      self.input_box1.insert(tkinter.END, file_path) #結果を表示
                    
                    
                    
                      dicom_dir = file_path
                      image_sum = sum([
                          pydicom.dcmread(os.path.join(dicom_dir, f)).pixel_array
                          for f in os.listdir(dicom_dir)
                          if os.path.isfile(os.path.join(dicom_dir, f)) and f.endswith('.dcm')
                        ])
                        
                      img = plt.imshow(image_sum)
                      img.set_cmap('gray')
                      plt.axis('off')
                      plt.margins(0,0)
                      plt.gca().xaxis.set_major_locator(plt.NullLocator())
                      plt.gca().yaxis.set_major_locator(plt.NullLocator())
                      plt.savefig("Starshot.tiff", bbox_inches = 'tight', pad_inches = 0)
    
    
    
    #解析                   
        def pf_analyze():          
                    
                      
                      mystar =Starshot(file_select,sid=self.input_box2.get(),dpi=self.input_box3.get())
                      mystar.analyze(radius=0.5, tolerance=0.8) 
                      print(mystar.results())
                      mystar.plot_analyzed_image()
                      mystar.publish_pdf('mystar2.pdf')
                      
     #入力欄の作成
        self.input_box1 = tkinter.Entry(width=40)
        self.input_box1.place(x=10, y=100)
                
        self.input_box2 = tkinter.Entry(width=40)
        self.ArithmeticErrorinput_box2.place(x=10, y=190)
               
        self.input_box3 = tkinter.Entry(width=40)
        self.input_box3.place(x=10, y=240)    
        
    #ラベルの作成
        self.input_label1 = tkinter.Label()
        self.input_label1.place(x=10, y=70)
        self.input_label2 = tkinter.Label(text="sid")
        self.input_label2.place(x=10, y=160)
        self.input_label3 = tkinter.Label(text="dpi")
        self.input_label3.place(x=10, y=210)
    
    #ボタンの作成
    button1 = tkinter.Button(text="参照",command=file_select)
    button1.place(x=10, y=40)
    button2 = tkinter.Button(text="解析",command=pf_analyze)
    button2.place(x=10, y=270)
              
    #ウインドウの作成
    root = tkinter.Tk()
    root.title("Python GUI")
    root.geometry("500x500")
                            
    #ウインドウの描画
    root.mainloop()
    
```
CC BY-SA 4.0
2021-03-09T09:31:33.487
74546
2021-03-09T12:39:11.943
2021-03-09T12:34:44.493
3060
41571
question
python tkinter
PythonのGUIで参照方法がわからない
[tkinterを使用し、為替変換をしたい](https://ja.stackoverflow.com/questions/63459/)
を参考にしてコードを作成してみました。入力データのサニタイズやエラーチェックをしていないので、それらを追加する必要がありますが、たたき台としては丁度よいのではないかと思います。

```

    import os
    import pydicom
    import matplotlib.pyplot as plt
    from pylinac import Starshot
    from tkinter import Tk, Frame, Label, Button, Entry, filedialog
    from tkinter import StringVar, IntVar, W
    
    STARSHOT_IMAGE_FILE = 'Starshot.tiff'
    
    class AnalyzeImage(Tk):
      def __init__(self):
        Tk.__init__(self)
        self.file_path = StringVar(value='')
        self.sid = IntVar(value='')
        self.dpi = IntVar(value='')
    
        #DICOM画像フォルダを選択
        frame = Frame(self).grid()
        Button(
          frame, text='参照', command=self.file_select
        ).grid(sticky=W, padx=5, pady=10)
        self.file_path_box = Entry(frame, width=40, textvariable=self.file_path)
        self.file_path_box.grid(padx=5)
    
        #spacing
        Label(frame).grid()
    
        #sid, dpi
        Label(frame, text='sid').grid(sticky=W, padx=5)
        self.sid_box = Entry(frame, width=40, textvariable=self.sid)
        self.sid_box.grid(padx=5)
        Label(frame, text='dpi').grid(sticky=W, padx=5)
        self.dpi_box = Entry(frame, width=40, textvariable=self.dpi)
        self.dpi_box.grid(padx=5)
        Button(
          frame, text='解析', command=self.pf_analyze
        ).grid(sticky=W, padx=5, pady=10)
    
      #画像の合算      
      def file_select(self):
        idir = r"C:\Users\tanim\OneDrive\デスクトップ"
        #結果を表示
        self.file_path.set(filedialog.askdirectory(initialdir = idir))
    
        dicom_dir = self.file_path.get()
        image_sum = sum([
          pydicom.dcmread(os.path.join(dicom_dir, f)).pixel_array
          for f in os.listdir(dicom_dir)
          if os.path.isfile(os.path.join(dicom_dir, f)) and f.endswith('.dcm')
        ])
                        
        img = plt.imshow(image_sum)
        img.set_cmap('gray')
        plt.axis('off')
        plt.margins(0,0)
        plt.gca().xaxis.set_major_locator(plt.NullLocator())
        plt.gca().yaxis.set_major_locator(plt.NullLocator())
        plt.savefig(STARSHOT_IMAGE_FILE, bbox_inches = 'tight', pad_inches = 0)
    
      #解析
      def pf_analyze(self):
        mystar = Starshot(STARSHOT_IMAGE_FILE, sid=self.sid.get(), dpi=self.dpi.get())
        mystar.analyze(radius=0.5, tolerance=0.8) 
        print(mystar.results())
        mystar.plot_analyzed_image()
        mystar.publish_pdf('mystar2.pdf')
    
    if __name__ == '__main__':
      gui = AnalyzeImage()
      gui.mainloop()
    
```
CC BY-SA 4.0
2021-03-09T12:29:44.030
74552
2021-03-09T12:39:11.943
2021-03-09T12:39:11.943
74546
answer