前提・実現したいこと
【環境】
macOS High Sierra 10.13
Python3.6.10
IDE->Visual Studio code
Tkinterを使って簡単なGUIアプリを作成し、
pyinstallerでアプリケーション化したいと思っています。
発生している問題・エラーメッセージ
そもそもエラーメッセージすら出ずに起動中のアニメーションの後にすぐ終了してしまいます。 同時にできるExecファイルは問題なく実行できます。
該当のソースコード
python
1# 所々元のコードから"テキスト"や"URL"に変更してあります。 2from tkinter import * 3import tkinter as tk 4from tkinter import messagebox as mbox 5# web automation 6from selenium import webdriver 7from selenium.webdriver.support.ui import Select 8import datetime 9import time 10import numpy as np 11from getpass import getpass 12import os 13# import sys 14 15 16def main(): 17 18 # 再起数上限の変更 19 # sys.setrecursionlimit(20000) 20 21 # ウィンドウを作成 22 win = tk.Tk() 23 win.title("テキスト") 24 win.resizable(False, False) 25 frame1 = tk.Frame(win) 26 frame1.grid() 27 28 # ユーザー名 29 # ラベルを作成 30 label_user = tk.Label(frame1, text='Username') 31 label_user.grid(row=0, column=0, sticky=E) 32 33 # テキストボックスを作成 34 text_user = StringVar() 35 username_entry = tk.Entry( 36 frame1, 37 textvariable = text_user, 38 width=20) 39 username_entry.grid(row=0, column=1) 40 41 # パスワード 42 # ラベルを作成 43 label_pass = tk.Label(frame1, text='Password') 44 label_pass.grid(row=1, column=0, sticky=E) 45 46 # テキストボックスを作成 47 text_pass = StringVar() 48 password_entry = tk.Entry( 49 frame1, 50 textvariable = text_pass, 51 width=20, 52 show='*') 53 password_entry.grid(row=1, column=1) 54 55 # 56 # ラベルを作成 57 label_BT = tk.Label(frame1, text='BT') 58 label_BT.grid(row=2, column=0, sticky=E) 59 60 # テキストボックスを作成 61 text_BT = StringVar() 62 temp_entry = tk.Entry( 63 frame1, 64 textvariable = text_BT, 65 width=20) 66 temp_entry.grid(row=2, column=1) 67 68 def ok_click(): 69 # テキストボックスの内容を得る 70 username = text_user.get() 71 password = text_pass.get() 72 BT = text_BT.get() 73 74 # 75 web_automation(username, password, BT) 76 77 # ウィンドウを閉じる 78 win.quit() 79 80 # ダイアログを表示 81 mbox.showinfo('完了しました!') 82 83 # ボタンを作成 84 frame2 = tk.Frame(frame1) 85 frame2.grid(row=3, column=1, sticky=W) 86 87 okButton = tk.Button( 88 frame2, text='OK', command=ok_click) 89 okButton.pack(side=LEFT) 90 91 def quit(): 92 # ウィンドウを閉じる 93 win.quit() 94 95 quitButton = tk.Button(frame2, text='Cancel', command=quit) 96 quitButton.pack(side=LEFT) 97 98 # ウィンドウを開く 99 win.mainloop() 100 101 102def web_automation(username, password, BT): 103 104 # 日時 105 today = datetime.date.today() 106 time_zone = np.random.randint(6,8) 107 108 # BT matrix 109 body_temp = {} 110 for i in range(42): 111 body_temp[str(round(35.9+i/10,1))] = i+1 112 113 if float(BT)>40.0: 114 BT_value = 42 115 elif float(BT)<35.9: 116 BT_value = 1 117 else: 118 BT_value = body_temp[BT] 119 120 # Configuration 121 CONFIG = { 122 'username': username, 123 'password': password, 124 'BT': BT_value, 125 } 126 127 # ブラウザを開く 128 driver_dir = os.getcwd() 129 driver_path = os.path.join(driver_dir,'chromedriver') 130 driver = webdriver.Chrome(driver_path) 131 driver.get("URL") 132 133 # ユーザー名を入力 134 driver.find_element_by_name("username").send_keys(CONFIG['username']) 135 136 # パスワードを入力 137 driver.find_element_by_name("val").send_keys(CONFIG['password']) 138 139 # ログインボタンをクリック 140 driver.find_element_by_id("LoginBtn").click() 141 142 # 143 driver.find_element_by_xpath('//*[@id="%s"]/li[3]/div/div[1]/a').click() 144 145 # 146 time.sleep(1) 147 driver.find_element_by_link_text("テキスト").click() 148 149 # 3秒待機 150 time.sleep(1) 151 152 # 開始 153 iframe = driver.find_elements_by_xpath("//frame")[1] 154 driver.switch_to_frame(iframe) 155 driver.find_element_by_xpath('//*[@id="PageBody"]/table/tbody/tr/td[2]/form/table[2]/tbody/tr/td/input[1]').click() 156 157 # フレームを移動 158 iframe = driver.find_element_by_xpath("/html/frameset/frameset/frame[2]") 159 driver.switch_to_frame(iframe) 160 161 # XPath 162 question_path = { 163 1:'/html/body/form/div[1]/div/div/table/tbody/tr/td/table/tbody/tr/td/select', 164 2:'/html/body/form/div[2]/div/div/table/tbody/tr/td/table/tbody/tr/td/select', 165 3:'/html/body/form/div[3]/div/div/table/tbody/tr/td/table/tbody/tr/td/select', 166 4:'/html/body/form/div[4]/div/div/table/tbody/tr/td/table/tbody/tr/td/select', 167 5:'/html/body/form/div[5]/div/div/table/tbody/tr/td/fieldset/table/tbody/tr[1]/td[2]/label', 168 6:'/html/body/form/div[6]/div/div/table/tbody/tr/td/fieldset/table/tbody/tr[1]/td[2]/label', 169 7:'/html/body/form/div[7]/div/div/table/tbody/tr/td/fieldset/table/tbody/tr[1]/td[2]/label', 170 8:'/html/body/form/div[8]/div/div/table/tbody/tr/td/fieldset/table/tbody/tr[1]/td[2]/label', 171 } 172 173 # 設問 174 for i,path in question_path.items(): 175 dropdown = driver.find_element_by_xpath(path) 176 if i == 1: 177 Select(dropdown).select_by_value(str(today.month)) 178 elif i == 2: 179 Select(dropdown).select_by_value(str(today.day)) 180 elif i == 3: 181 Select(dropdown).select_by_value(str(time_zone)) 182 elif i == 4: 183 Select(dropdown).select_by_value(str(CONFIG['BT'])) 184 else: 185 dropdown.click() 186 187 # 3秒待機 188 time.sleep(1) 189 190 # 回答を終了 191 driver.find_element_by_xpath('//*[@id="GradeBtn"]').click() 192 193 # 3秒待機 194 time.sleep(3) 195 196 # 終了 197 driver.switch_to_default_content() 198 iframe = driver.find_element_by_xpath("/html/frameset/frameset/frame[2]") 199 driver.switch_to_frame(iframe) 200 driver.find_element_by_xpath('//*[@id="ContentInfo"]/tbody/tr[2]/td/input').click() 201 202 # ブラウザを閉じる 203 driver.close() 204 205if __name__ == '__main__': 206 main() 207
試したこと
最初Execファイルもエラーで実行できなかったのですが、こちらの記事を参考にして再度pyinstallerからアプリを作ったところ、Execファイルだけは実行可能になりました。
py2app、cx_Freezeも試してみましたが、py2appは最大再起数を超えているというエラー(この記事を参考に追記してもダメでした)、cx_Freezeでは、
File "/Users/ユーザー名/opt/anaconda3/lib/python3.6/posixpath.py",
line 156, in dirname
p = os.fspath(p)
TypeError: expected str, bytes or os.PathLike object, not NoneType
というエラーが出てどちらもアプリケーション化出来ませんでした。
まだ始めたばかりで不十分な点が多いと思うのですが、教えていただければ幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。