【问题标题】:How to control the values of other comboboxes using the value selected in first combobox in python gui?如何使用python gui中第一个组合框中选择的值来控制其他组合框的值?
【发布时间】: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()

请帮我解决这个问题

【问题讨论】:

  • 可能你需要绑定一个事件:&lt;&lt;ComboboxSelected&gt;&gt;.
  • 使用绑定事件我只能控制最后创建的组合框......因为 header_sheet 只对应于最后创建的组合框......如何控制其他组合框

标签: python tkinter combobox


【解决方案1】:

我创建了一个随机字符串数组...随机字符串数组的每个值都用作每个组合按钮的名称,而不是只为所有组合按钮使用一个名称(使用单一名称的缺点是它允许用户只能控制最后创建的组合框)

【讨论】:

    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多