在root.destroy()和第二次调用filedialog.askdirectory()后,Tkinter应用程序在MacOS上崩溃了。

0 人关注

我创建了一个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>