Сделайте один Dropbox, содержимое которого зависит от значения в другом Dropbox в tkinter python3 - PullRequest
0 голосов
/ 31 мая 2019

Я делаю приложение с графическим интерфейсом, которое читает и записывает таблицы Excel с использованием библиотек "openpyxl" и "tkinter" (py3).

У меня есть 2 дропбокса (я использую "tkinter.ttk.OptionBox", но если вы хотите предложить какой-то другой виджет, тогда продолжайте).Я хочу, чтобы в одном выпадающем списке были имена листов, которые есть в книге Excel, а во втором - заголовки столбцов этого листа.Я сделал для пользователя кнопку обзора, чтобы просмотреть файл Excel, а также хочу открыть / загрузить книгу Excel как можно меньше раз, чтобы повысить эффективность.Кроме того, файлы, которые будут использоваться, будут довольно большими.

Я сделал это (обратитесь к коду), но проблема в том, что когда я изменяю имя листа в одном раскрывающемся списке, в другом раскрывающемся списке заголовки столбцов не изменяются, а остаются в качестве заголовка столбцапервый лист.Я искал это онлайн, но не смог найти ничего стоящего.Я был бы очень признателен за помощь.Заранее спасибо.

self.dropdownMain1Var = StringVar()
self.dropdownMain2Var = StringVar()
wbb = openpyxl.load_workbook(filepath)
wbb_worksheets = wbb.worksheets
for i in range(len(wbb_worksheets)):
    wbb_worksheets[i] = str(wbb_worksheets[i]).split('"')[-2]

self.dropdownMain1Var.set(wbb_worksheets[0])
self.dropdownMain1 = OptionMenu(self.topFrame, self.dropdownMain1Var, *wbb_worksheets)
self.dropdownMain1.grid(row=5, column=0)

columnheaders = list((str(i) + ".) " + wbb[self.dropdownMain1Var.get()].cell(row=1, column=i).value) for i in
range(1, wbb[self.dropdownMain1Var.get()].max_column + 1))

self.dropdownMain2Var.set(columnheaders[0])
self.dropdownMain2 = OptionMenu(self.topFrame, self.dropdownMain2Var, *columnheaders)
self.dropdownMain2.grid(row=8, column=0)

1 Ответ

0 голосов
/ 31 мая 2019

Вам необходимо следить за сменой вашего OptionMenu.Это может быть сделано путем отслеживания вашего StringVar:

self.dropdownMain1Var.trace("w",function_to_change_other_OptionMenu)

Или вы можете использовать ttk.Combobox и использовать событие ComboboxSelected для обновления:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

l1 = {"Excel A":["Column A","Column B","Column C"],"Excel B":["Column 1","Column 2"]} #make a dict from your excel & sheet names

a = ttk.Combobox(root,value=[k for k in l1],state="readonly")
a.pack()

b = ttk.Combobox(root,state="readonly")
b.pack()

def change_box(event=None):
    b["values"] = l1.get(a.get())
    b.current(0)

a.bind("<<ComboboxSelected>>",change_box)

root.mainloop()
...