- Главное окно — пользователь нажимает [Загрузить файл]
- Открывает диалоговое окно, пользователь выбирает файл Excel
- Появляется мини-окно верхнего уровня, в котором пользователю предлагается выбрать лист из поля со списком, нажмите «Выбрать»
- Мини-окно верхнего уровня закрывается, в главном окне отображается Excel в виде дерева
Проблема, с которой, как мне кажется, я столкнулся; когда появляется мини-окно TopLevel, главное окно все еще работает и ожидает отображения «имени листа» в TreeView. Таким образом, перед тем, как пользователь сможет выполнить часть 3, отображается ошибка, что имя листа имеет значение «null».
Ниже код представляет собой части 1,2,4
Код: Выделить всё
# Function to load data from Excel to Treeview
def load_data_func():
global filepath, excel_file
# Clear existing data in Treeview
for item in treeview.get_children():
treeview.delete(item)
# Read Excel File
print("filepath = ", filepath)
excel_name = os.path.basename(filepath)
FileName_display.config(text=f"{excel_name}") # Display Filename
excel_file = pd.ExcelFile(filepath) # Excel File without specific sheet
# Open ChooseSheet_Dialog to choose sheet
selected_sheet = ""
selected_sheet = show_sheet_window(excel_name)
excel_sheet = excel_file.parse(selected_sheet) # Excel File with specific sheet
# Set Treeview Header
treeview["columns"] = list(excel_sheet.columns)
#treeview["show"] = "headings" # Hide the default first column
for col in excel_sheet.columns:
treeview.heading(col, text=col)
treeview.column(col, width=100, minwidth=150, stretch=False)
# Insert data rows to Treeview
for index, row in excel_sheet.iterrows():
treeview.insert("", "end", values=list(row))
Код: Выделить всё
# Function to open child window for user to choose sheet
def show_sheet_window(excel_name):
global excel_file
list_of_sheets = excel_file.sheet_names
chosen_ComboValue = "" # Variable to store Chosen Sheetname later
print("List of sheets = ", list_of_sheets)
# Find a way to compare header and take only legit sheets
# ------------
# Create Window
chooseSheet_Box = tk.Toplevel(root)
chooseSheet_Box.title("Select a Sheet Name")
chooseSheet_Box.geometry("300x100")
# Disable Main Window
chooseSheet_Box.grab_set()
chooseSheet_Box.transient(root) # Ensure in front
# Create Frame
CS_Frame = ttk.Frame(chooseSheet_Box, padding=20)
CS_Frame.pack(fill="both", expand=True)
CS_FileName_label = ttk.Label(CS_Frame, text="File Name:")
CS_FileName_display = ttk.Label(CS_Frame, text=excel_name)
CS_FileName_label.grid(row=0, column=0)
CS_FileName_display.grid(row=0, column=1)
CS_Sheet_label = ttk.Label(CS_Frame, text="Choose Sheet:")
CS_Combobox = ttk.Combobox(CS_Frame, values=list_of_sheets)
CS_Combobox.current(2)
CS_Sheet_label.grid(row=1, column=0)
CS_Combobox.grid(row=1, column=1)
# Function to get Selected Sheet from Combobox
def chosen_Sheet():
global chosen_ComboValue
chosen_ComboValue = CS_Combobox.get()
chooseSheet_Box.destroy()
CS_Select_btn = ttk.Button(CS_Frame, text="Select", command=chosen_Sheet)
CS_Select_btn.grid(row=2, column=0)
print("Chosen Sheet = ", chosen_ComboValue)
return chosen_ComboValue
путь к файлу = /ECS200, серийный номер 2020-2023.xls
Список листов = ['2022', '2021', '2020', 'SAMPLE', 'Notes']
Выбранный лист =
Как видите, Выбранный лист = «ничего». Но пользователь даже не получил возможности выбрать лист, когда появилось мини-окно TopLevel.
Как приостановить главное окно и дождаться ввода данных в мини-окне, а затем возобновить?