【发布时间】:2020-04-08 10:28:47
【问题描述】:
在过去的 15 天里,我一直在使用 python 进行编码...我的代码需要一些小帮助... 该脚本将任何 excel 表(.xlsx)作为输入并生成第一个填充行作为具有相同名称的下拉按钮,并且它还列出了该下拉按钮中相应列的值。我使用 Combobox 创建了下拉按钮,并使用 for 循环创建了它们。问题是我只能控制最后创建的 Combobox。
我需要...
例如:
提供商品名称价格件
一月饼干 15 14
罗杰蛋糕 35 10
菲德尔饼干 20 20
瓦苏牛轧糖 10 5
一个 excel 文件有三张表(week1、week2、week3)具有相同的数据。
将创建一个 GUI,其中 NAME、ITEM、PRICE、PIECES AVAILABLE(headers) 作为下拉按钮,将显示每个标题的所有列元素。如果我从组合框中选择第 1 列的 Roger,则项目组合框应刷新索引为 1 的项目作为蛋糕,同样价格组合框应该只有 35 作为价格,依此类推。
我无法在此处上传 .xlsx 文件。但内容如示例所示,excel名称为items_list.xlsx
代码是
import tkinter as tk
from tkinter import ttk
import os
import openpyxl
from openpyxl.chart import BarChart3D,Reference
from pandas import DataFrame
from tkinter import messagebox
#update the path here
path = "C:\\Users\\anony\\Desktop"
#checking for the path
try:
os.chdir(path)
print("path changed")
print(os.getcwd())
# Caching the exception
except:
print("Path not found")
import openpyxl as py
from openpyxl.chart import BarChart,Reference
#update the file name
file = "items_list.xlsx"
wb = py.load_workbook(filename=file , read_only = False)
sheets = wb.sheetnames
print (sheets)
ws = wb.active
# intializing the window
window = tk.Tk()
window.title(file)
# configuring size of the window
window.geometry('350x200')
#Create Tab Control
TAB_CONTROL = ttk.Notebook(window)
def OptionCallBack(*args):
#print (header_data.get())
print (header_sheet.current())
def refresh_drop(event):
selected_index = header_sheet.current()
selected_value = header_sheet.get()
print ("selected_index")
print (selected_index)
print ("selected value")
print (selected_value)
#finding max_row, header_row of each sheet
for m in range (0,len(sheets)):
TAB1 = ttk.Frame(TAB_CONTROL)
TAB_CONTROL.add(TAB1, text=sheets[m])
sheet = wb[sheets[m]]
m_row = sheet.max_row
m_col= sheet.max_column
for i in range(1, m_row + 1):
cell_obj = sheet.cell(i,1) #cell(row,column)
print (cell_obj.value)
if(cell_obj.value is not None):
print ("it comes")
header_row=i
print (header_row)
break
value_list = []
for n in range(1,m_col+1):
cell_obj = sheet.cell(header_row,n)
header_row_values = cell_obj.value
if (header_row_values is not None):
value_list.append(header_row_values)
for o in range (header_row+1,m_row+1):
cell_obj1 = sheet.cell(o,n)
values_of_that_col = cell_obj1.value
value_list.append(values_of_that_col)
header_data = tk.StringVar()
header_data.trace('w',OptionCallBack)
value = header_data.get()
header_sheet= ttk.Combobox(TAB1,width= 15,textvariable = value,values = value_list)
#value_list.clear()
header_sheet.grid(column = n, row =1)
header_sheet.current(0)
#global value_list_copy
value_list_copy.append(value_list)
value_list.clear()
#global selected_row
#global selected_col
# Tab_selected = TAB_CONTROL.tab(TAB_CONTROL.select(), "text")
# print(Tab_selected)
# for m in range (0,len(sheets)):
# if (sheets[m] == Tab_selected):
# header_sheet1.bind("<<ComboboxSelected>>",refresh_drop)
TAB_CONTROL.pack(expand=1, fill="both")
window.mainloop()
请帮我解决这个问题
【问题讨论】:
-
可能你需要绑定一个事件:
<<ComboboxSelected>>. -
使用绑定事件我只能控制最后创建的组合框......因为 header_sheet 只对应于最后创建的组合框......如何控制其他组合框