我创建了一个tkinter应用程序,在Windows上工作得很好,但在MacOS上似乎在一个非常特殊的时刻会崩溃。
一些背景。该应用程序在本地计算机和数据仓库之间的ODBC连接上发挥GUI功能。在成功上传/下载后,用户可以重新启动应用程序,并再次上传/下载数据。
在root.destroy()之后,应用程序再次启动,一旦用户再次选择浏览按钮,脚本第二次调用文件对话框.askdirectory(),应用程序就会崩溃,并给出一个分段故障11。
编辑:我在代码下面附上了分段故障的错误信息 有人知道如何解决这个问题吗?
见下面脚本的相关部分(请不要介意进口清单)。
import os
import threading
import tkinter as tk
import importlib
import requests
from tkinter import filedialog
import databricks_odbc_tool
from tkinter import *
from tkinter import ttk
from tkinter.filedialog import askopenfile
from databricks_odbc_tool import run_from_gui
from pathlib import Path
from os import path
from PIL import ImageTk, Image
import calendar
import time
import webbrowser
import sys
import promptlib
#----------------------------------INIT CLASS-------------------------------------------------------#
class App():
gmt = time.gmtime()
ts = calendar.timegm(gmt)
function = 'upload'
file_format = 'csv'
filepath = Path.home()
delimiter = '\t'
delimiter_text = "Tab (\\t)"
header_bool = 1
replace = "true"
query_text = '"'
tq = '"'
new_file_name_text = ""
def callback(self, url):
webbrowser.open_new(url)
def __init__(self):
self.root = tk.Tk()
self.root.title("Data Transfer Wizard")
self.root.iconbitmap("pepe.icns")
self.root.geometry("800x600")
self.start_label = Label(self.root, text="Do you want to Upload or Download tables?")
self.start_label.pack(pady=10)
self.download_button=tk.Button(self.root, text="Download", command=self.start_download)
self.download_button.pack(pady=10)
self.root.mainloop()
#---------------------------------------MAIN FUNCTIONS------------------------------------------#
def start_download(self):
self.function = 'download'
for widgets in self.root.winfo_children():
widgets.destroy()
download_label = Label(self.root, text="Select the directory where you want to download files to")
download_label.pack(pady=10)
self.browse_button = tk.Button(text="Browse", command=self.browse_download_folder)
self.browse_button.pack(pady=10)
def browse_download_folder(self):
self.download_path = filedialog.askdirectory() #This is which leads to segmentation fault 11
#tried to solve it with the two lines below, but leads to the same error
#prompter = promptlib.Files()
#self.download_path = prompter.dir()
if self.download_path:
self.choose_download_table()
def choose_download_table(self):
self.browse_button["state"] = tk.DISABLED
self.start_over_button = tk.Button(self.root, text="Return to Home", command=self.start_over, state=tk.NORMAL)
self.start_over_button.pack(pady=10)
def start_over(self):
importlib.reload(databricks_odbc_tool)
self.root.destroy()
self.top.destroy()
except:
App()
#--------------------------------------START APP------------------------------------------------#
if __name__ == "__main__":
win = App()
Current thread 0x000000010ed8e600 (most recent call first):
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/commondialog.py", line 45 in show
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/filedialog.py", line 442 in askdirectory
File "<string>", line 72 in browse_download_folder
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/__init__.py", line 1921 in __call__
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/__init__.py", line 1458 in mainloop
File "<string>", line 57 in __init__
File "<string>", line 102 in <module>
File "/Users/nickyboon/Documents/GitHub/Data-Transfer-Wizard/test.py", line 87 in restart
File "/Users/nickyboon/Documents/GitHub/Data-Transfer-Wizard/test.py", line 92 in start_over
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/__init__.py", line 1921 in __call__
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/__init__.py", line 1458 in mainloop
File "/Users/nickyboon/Documents/GitHub/Data-Transfer-Wizard/test.py", line 57 in __init__
File "/Users/nickyboon/Documents/GitHub/Data-Transfer-Wizard/test.py", line 102 in <module>