1. ホーム
  2. パイソン

PythonでGUIを書く+実行ファイル(.exe)を生成する

2022-03-01 04:14:54

目次

I.GUI(グラフィカル・ユーザー・インターフェース)

1. 必要なパッケージのインポート

2. フォルダ内の全画像を取得

3. クラスウィンドウの定義

4. ウィンドウとフレームの作成

5. 使用する必要がある機能を定義する(使用する次、前などのボタン)。

6. ボタン、キャンバスを作成し、メインプログラムを呼び出す

エフェクト表示

フルコード

II. exeファイルの生成

1. pyinstallerのインストール

2.Pythonプログラムをパッケージ化する

3.exeファイルを実行する

4. 共通コマンドパラメータ

エフェクト表示


I.GUI(グラフィカル・ユーザー・インターフェース)

1. 必要なパッケージのインポート

import tkinter as tk
import tkinter.messagebox
import copy
import os

2. フォルダ内の全画像を取得

def get_picture(dirs):
    '''Get all pictures'''
    picture_list = []
    for dir, dir_abs, files in os.walk(dirs):
        for file in files:
            if file.endswith('.png'): # Note check the format of the parsed data
                picture_list.append(os.path.join(dir, file))
    return picture_list


3. クラスウィンドウの定義

class Window:
    button_list = []
    object_list = []
    pictures = get_picture("F:\\pic\\class-1\\\classresnet\\\\data\\\dangerous")
    file = pictures[0]
    is_show = True
    index = 0
    image_file = ''

4. ウィンドウとフレームの作成

    def __init__(self):
        '''Create window and frame'''
        self.window = tk.
        self.window.title('Goggle safety detection')
        self.window.geometry('600x400')
        self.frame = tk.Frame(self.window)
        self.frame.pack()
        self.frame_l = tk.Frame(self.frame)
        self.frame_r = tk.Frame(self.frame)
        self.frame_l.pack(side='left')
        self.frame_r.pack(side='right')
        self.frame_ll = tk.Frame(self.frame_r)
        self.frame_rr = tk.Frame(self.frame_r)
        self.frame_ll.pack(side='left')
        self.frame_rr.pack(side='right')

5. 使用する必要がある機能を定義する(使用する次、前などのボタン)

    def next_picture(self):
        '''next_picture'''
        self.index = self.pictures.index(self.file)
        self.index += 1
        if self.index < len(self.pictures):
            self.checkout_button()
            self.file = self.pictures[self.index]
            self.create_canvas(self.file)
        else:
            self.index = len(self.pictures) - 1
            tkinter.messagebox.showinfo('hint', 'almost the last one')

    def checkout_button(self):
        '''Determine if there are only button objects in the list'''
        object_list_copy = copy.copy(self.object_list)
        for ob in self.object_list:
            if ob in self.button_list:
                pass
            else:
                b = object_list_copy.pop(self.object_list.index(ob))
                b.destroy()
        self.object_list = object_list_copy

    def pre_picture(self):
        '''previous_page''''
        self.index = self.pictures.index(self.file)
        self.index -= 1
        if self.index >= 0:
            self.checkout_button()
            self.file = self.pictures[self.index]
            self.create_canvas(self.file)
        else:
            self.index = 0
            tkinter.messagebox.showinfo('Hint', 'It's already the first one')

    def show_picture(self):
        '''Show picture and page turn button'''
        self.file = self.pictures[0]
        if self.is_show:
            self.is_show = False
            self.create_canvas(self.file)
            button1 = tk.Button(self.frame_ll, text='Previous', font=('Arial', 12), width=10, height=1, bg='orange',
                                command=self.pre_picture, relief='ridge', )
            button1.pack()
            button2 = tk.Button(self.frame_rr, text='next', font=('Arial', 12), width=10, height=1, bg='orange',
                                command=self.next_picture, relief='ridge', )
            button2.pack()
            self.button_list.append(button1)
            self.button_list.append(button2)
            self.object_list.extend(self.button_list)
        else:
            self.is_show = True
            while self.object_list:
                o = self.object_list.pop()
                o.destroy()

6. ボタン、キャンバスを作成し、メインプログラムを呼び出す

    def new_button(self):
        '''Create display button''' "Start detecting and displaying results can be done here with a new tk.button"
        tk.Button(self.frame_l, text='Start reading', font=('Arial Black', 12), width=10, height=1, bg='green',
                  command=self.show_picture, relief='ridge').pack()
        # tk.Button(self.frame_l, text='Start detection', font=('Arial Black', 12), width=10, height=1, bg='blue',command=classresnet, relief='ridge').pack()

    def create_canvas(self, file):
        '''Show the image with canvas'''
        self.image_file = tk.PhotoImage(file=file)
        canvas = tk.Canvas(self.frame

エフェクトのショーケース

フルコード

import tkinter as tk
import tkinter.messagebox
import copy
import os
# from glob2 import glob
# import main

"""Graphical User Interface (GUI)"""
def get_picture(dirs):
    '''Get all pictures'''
    picture_list = []
    for dir, dir_abs, files in os.walk(dirs):
        for file in files:
            if file.endswith('.png'): # Note check the format of the parsed data
                picture_list.append(os.path.join(dir, file))
    return picture_list



class Window:
    button_list = []
    object_list = []

    # for pngfile in glob("F:\\pic\\\\class-1\\\classresnet\\\\datas\\\\*.png"):
    # main.image_demo()
    # output_dir = "F:\\pic\\\class-1\\\classresnet\\\\data\\\try" # Save the intercepted image directory
    # print('Image acquisition completed . . .')
    #
    # main.classresnet()

    pictures = get_picture("F:\\pic\\\class-1\\\classresnet\\\\data\\\dangerous")
    file = pictures[0]
    is_show = True
    index = 0
    image_file = ''

    def __init__(self):
        '''Create window and frame'''
        self.window = tk.
        self.window.title('Goggle safety detection')
        self.window.geometry('600x400')
        self.frame = tk.Frame(self.window)
        self.frame.pack()
        self.frame_l = tk.Frame(self.frame)
        self.frame_r = tk.Frame(self.frame)
        self.frame_l.pack(side='left')
        self.frame_r.pack(side='right')
        self.frame_ll = tk.Frame(self.frame_r)
        self.frame_rr = tk.Frame(self.frame_r)
        self.frame_ll.pack(side='left')
        self.frame_rr.pack(side='right')

    def next_picture(self):
        '''Next picture'''
        self.index = self.pictures.index(self.file)
        self.index += 1
        if self.index < len(self.pictures):
            self.checkout_button()
            self.file = self.pictures[self.index]
            self.create_canvas(self.file)
        else:
            self.index = len(self.pictures) - 1
            tkinter.messagebox.showinfo('hint', 'almost the last one')

    def checkout_button(self):
        '''Determine if there are only button objects in the list'''
        object_list_copy = copy.copy(self.object_list)
        for ob in self.object_list:
            if ob in self.button_list:
                pass
            else:
                b = object_list_copy.pop(self.object_list.index(ob))
                b.destroy()
        self.object_list = object_list_copy

    def pre_picture(self):
        '''previous_page''''
        self.index = self.pictures.index(self.file)
        self.index -= 1
        if self.index >= 0:
            self.checkout_button()
            self.file = self.pictures[self.index]
            self.create_canvas(self.file)
        else:
            self.index = 0
            tkinter.messagebox.showinfo('Hint', 'It's already the first one')

    def show_picture(self):
        '''Show picture and page turn button'''
        self.file = self.pictures[0]
        if self.is_show:
            self.is_show = False
            self.create_canvas(self.file)
            button1 = tk.Button(self.frame_ll, text='Previous', font=('Arial', 12), width=10, height=1, bg='orange',
                                command=self.pre_picture, relief='ridge', )
            button1.pack()
            button2 = tk.Button(self.frame_rr, text='next', font=('Arial', 12), width=10, height=1, bg='orange',
                                command=self.next_picture, relief='ridge', )
            button2.pack()
            self.button_list.append(button1)
            self.button_list.append(button2)
            self.object_list.extend(self.button_list)
        else:
            self.is_show = True
            while self.object_list:
                o = self.object_list.pop()
                o.destroy()

    # def code_button(self):
    # tk.Button(self.frame_l, text='Start detection', font=('Arial Black', 12), width=10, height=1, bg='blue',
    # command=main.classresnet, relief='ridge').pack()

    def new_button(self):
        '''Create show button''' "Start detecting and displaying results can be added here with a new tk.button"
        tk.Button(self.frame_l, text='Start reading', font=('Arial Black', 12), width=10, height=1, bg='green',
                  command=self.show_picture, relief='ridge').pack()
        # tk.Button(self.frame_l, text='Start detection', font=('Arial Black', 12), width=10, height=1, bg='blue',command=classresnet, relief='ridge').pack()

    def create_canvas(self, file):
        '''Show the image with canvas'''
        self.image_file = tk.PhotoImage(file=file)
        canvas = tk.Canvas(self.frame_r, height=500, width=600, bg='gray')
        canvas.create_image(1, 1, anchor='nw', image=self.image_file)
        canvas.pack()
        self.object_list.append(canvas)

    def run(self):
        '''main program call''''
        self.window.mainloop()

if __name__ == '__main__':


    w = Window()
    w.new_button()
    w.run()









II. exeファイルの生成

Windows では、pyinstaller を使って python プログラムを exe 実行形式としてパッケージングすることができます。

1. pyinstallerのインストール

cmdコマンドラインウィンドウで以下のコマンドを実行し、pyinstallerをインストールします。

pip install pyinstaller

2. pythonプログラムのパッケージング

Pythonプログラムが置かれているディレクトリで、以下のコマンドを実行します。

pyinstaller -F xxx.py -w

注意:-wを付けないと、生成されたexeファイルはコマンドラインウィンドウで表示されます

3. exeファイルを実行する

パッケージが完成すると、対応するディレクトリにbuildフォルダとdistフォルダが、distフォルダにexeファイルが表示されますので、そのまま実行してください。

4. 共通コマンドパラメータ

(1) -F パッケージング後に生成されるexeファイルが1つだけであることを指定します(distファイルにはexeファイルT1が1つだけ含まれます)。

<ブロッククオート

pyinstaller -F T1.py

(2) -i 生成されたプログラムのアイコンを変更します。

<ブロッククオート

pyinstaller -F -i . /my.ico T1.py

(3) -n NAME, -name=NAMEは生成されるファイル名(mypy)を設定します。

pyinstaller -F -n mypy -i . /my.ico T1.py

エフェクトショーケース