如何通过从下拉列表中选择一个因素将特定单元格值从 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")