如何通过从下拉列表中选择一个因素将特定单元格值从 excel 导入到 tkinter 标签框中?
How to import a specific cell values from excel into a tkinter label box by selecting a factor from dropdown?
from tkinter import *
from tkinter import ttk
import openpyxl
from openpyxl import load_workbook
win=Tk()
BLOCK_NAME=StringVar()
VILLAGE_NA=StringVar()
wb = load_workbook(filename=r"C:\Users\Hp\Desktop\Test data.xlsx")
ws = wb['Sheet1']
xlsx_range = ws['B2':'B10']
elements = []
for cell in xlsx_range:
for x in cell:
y = x.value
elements.append(y)
print(y)
def lookupdata(event):
print(combodata.get())
def lookupvillage():
if combodata.get()==(Say B2):
BLOCK_NAME.set([sheet["C2"].value])
elif combodata.get()==(Say B3):
BLOCK_NAME.set([sheet["C3"].value])
elif combodata.get()==(Say B4):
BLOCK_NAME.set([sheet["C4"].value])
Label(win, text="Select data").grid(row=1, column=1, padx=10, pady=10)
combodata=ttk.Combobox(win, textvariable=clicked, width=30)
combodata['values']=elements
combodata.grid(row=1, column=2,padx=50, pady=50)
combodata.bind("<<ComboboxSelected>>", lookupdata)
lbl3=Label(win, text="Block", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=6, column=0, padx=20, pady=5, sticky='w')
ent3=Entry(win, textvariable=BLOCK_NAME, width=20, state='readonly')
ent3.grid(row=6, column=1, padx=20, pady=5)
btn = Button(win, text = 'Calculate Value', command=lookupvillage, bd = '5', width=15, height=2)
btn.grid(row=7, column=2, padx=20, pady=10)
win.mainloop()
我准备了这段代码,它有助于在 Tkinter 中从 excel 值创建下拉列表。但我希望当从下拉列表中选择特定值时,应选择 excel 同一行中的数据并将其设置在 Tkinter 的标签框中。就像在下拉列表中选择的值在 B2 单元格中一样,我希望自动在标签中显示 C2 值。我在下拉列表中有超过 1000 个值,因此使用 if-elif 语句会很困难,请在这方面指导我(For 循环可能会有所帮助)。提前致谢。
前言:由于您没有提供任何示例数据,我使用此功能制作了自己的示例数据:
from openpyxl import Workbook
def create_sample_workbook():
wb = Workbook()
ws = wb.create_sheet("Sheet1")
columns = {
"B": ["alpha", "bravo", "charlie", "delta", "echo", "foxtrot", "golf", "hotel", "india", "juliet"],
"C": ["kilo", "lima", "mike", "november", "oscar", "papa", "quebec", "romeo", "sierra", "tango"]
}
for column_letter, col in columns.items():
for i, value in enumerate(col,1):
ws[f"{column_letter}{i}"] = value
wb.save("Test data.xlsx")
create_sample_workbook()
您的结果可能与我的不同,因为我们的数据不同。
我还必须将您的 combodata=ttk.Combobox(win, textvariable=clicked, width=30)
更改为 combodata=ttk.Combobox(win, width=30)
以修复代码中的 NameError。我认为这与您的问题没有直接关系。
For loop might be helpful.
这是一种有效的方法,是的。在 lookupvillage
内,遍历您感兴趣的行,并查看组合框是否与该行的 B 列匹配。
def lookupvillage():
value = combodata.get()
for i in range(2, 11):
if value == ws.cell(i, 2).value:
BLOCK_NAME.set(ws.cell(i, 3).value)
return
#couldn't find a matching value. Maybe the blank item is still selected?
BLOCK_NAME.set("unknown")
结果:
您还可以通过预先准备一个将 B 列值映射到它们对应的 C 和 D 值的字典来节省一点查找时间。把它放在 ws = wb['Sheet1']
:
下面
data = {} #todo: pick a more descriptive name that explains what kind of data is in B and C and D
for i in range(2,11):
data[ws.cell(i,2).value] = {"C": ws.cell(i,3).value, "D": ws.cell(i,4).value}
现在您可以快速找到任何 B 值的 C 和 D 值,无需循环:
def lookupvillage():
value = combodata.get()
if value in data:
BLOCK_NAME.set(data[value]["C"])
else:
BLOCK_NAME.set("unknown")
from tkinter import *
from tkinter import ttk
import openpyxl
from openpyxl import load_workbook
win=Tk()
BLOCK_NAME=StringVar()
VILLAGE_NA=StringVar()
wb = load_workbook(filename=r"C:\Users\Hp\Desktop\Test data.xlsx")
ws = wb['Sheet1']
xlsx_range = ws['B2':'B10']
elements = []
for cell in xlsx_range:
for x in cell:
y = x.value
elements.append(y)
print(y)
def lookupdata(event):
print(combodata.get())
def lookupvillage():
if combodata.get()==(Say B2):
BLOCK_NAME.set([sheet["C2"].value])
elif combodata.get()==(Say B3):
BLOCK_NAME.set([sheet["C3"].value])
elif combodata.get()==(Say B4):
BLOCK_NAME.set([sheet["C4"].value])
Label(win, text="Select data").grid(row=1, column=1, padx=10, pady=10)
combodata=ttk.Combobox(win, textvariable=clicked, width=30)
combodata['values']=elements
combodata.grid(row=1, column=2,padx=50, pady=50)
combodata.bind("<<ComboboxSelected>>", lookupdata)
lbl3=Label(win, text="Block", bg="crimson", fg="white", font=("times new roman",15,"bold")).grid(row=6, column=0, padx=20, pady=5, sticky='w')
ent3=Entry(win, textvariable=BLOCK_NAME, width=20, state='readonly')
ent3.grid(row=6, column=1, padx=20, pady=5)
btn = Button(win, text = 'Calculate Value', command=lookupvillage, bd = '5', width=15, height=2)
btn.grid(row=7, column=2, padx=20, pady=10)
win.mainloop()
我准备了这段代码,它有助于在 Tkinter 中从 excel 值创建下拉列表。但我希望当从下拉列表中选择特定值时,应选择 excel 同一行中的数据并将其设置在 Tkinter 的标签框中。就像在下拉列表中选择的值在 B2 单元格中一样,我希望自动在标签中显示 C2 值。我在下拉列表中有超过 1000 个值,因此使用 if-elif 语句会很困难,请在这方面指导我(For 循环可能会有所帮助)。提前致谢。
前言:由于您没有提供任何示例数据,我使用此功能制作了自己的示例数据:
from openpyxl import Workbook
def create_sample_workbook():
wb = Workbook()
ws = wb.create_sheet("Sheet1")
columns = {
"B": ["alpha", "bravo", "charlie", "delta", "echo", "foxtrot", "golf", "hotel", "india", "juliet"],
"C": ["kilo", "lima", "mike", "november", "oscar", "papa", "quebec", "romeo", "sierra", "tango"]
}
for column_letter, col in columns.items():
for i, value in enumerate(col,1):
ws[f"{column_letter}{i}"] = value
wb.save("Test data.xlsx")
create_sample_workbook()
您的结果可能与我的不同,因为我们的数据不同。
我还必须将您的 combodata=ttk.Combobox(win, textvariable=clicked, width=30)
更改为 combodata=ttk.Combobox(win, width=30)
以修复代码中的 NameError。我认为这与您的问题没有直接关系。
For loop might be helpful.
这是一种有效的方法,是的。在 lookupvillage
内,遍历您感兴趣的行,并查看组合框是否与该行的 B 列匹配。
def lookupvillage():
value = combodata.get()
for i in range(2, 11):
if value == ws.cell(i, 2).value:
BLOCK_NAME.set(ws.cell(i, 3).value)
return
#couldn't find a matching value. Maybe the blank item is still selected?
BLOCK_NAME.set("unknown")
结果:
您还可以通过预先准备一个将 B 列值映射到它们对应的 C 和 D 值的字典来节省一点查找时间。把它放在 ws = wb['Sheet1']
:
data = {} #todo: pick a more descriptive name that explains what kind of data is in B and C and D
for i in range(2,11):
data[ws.cell(i,2).value] = {"C": ws.cell(i,3).value, "D": ws.cell(i,4).value}
现在您可以快速找到任何 B 值的 C 和 D 值,无需循环:
def lookupvillage():
value = combodata.get()
if value in data:
BLOCK_NAME.set(data[value]["C"])
else:
BLOCK_NAME.set("unknown")