从空列表动态更新Tkinter组合框

2024-06-02 08:54:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力为我试图构建的tkinter应用程序找到解决方案

我试图构建的是一个工具,用于为excel文件提取工作表和标题。我想让用户能够选择他们想要从中提取的图纸和标题

class myApp:
importedSheets = []
us_sheets = None
headers = []
us_headers = None

def UploadAction(self):
    self.filename = askopenfilename()
    print(self.filename)

def sheetnames(self):
    global importedSheets
    self.xlssheets = xlrd.open_workbook(self.filename,on_demand=True)
    importedSheets = self.xlssheets.sheet_names()
    #print (importedSheets)
    return importedSheets

我可以让用户选择要从中提取信息的文件,并使用正确的工作表名称填充空列表importedSheets=[]

我似乎不知道如何在Tkinter组合框上显示此列表。每次我尝试它,它只是显示一个空白的组合框

    def __init__(self,master):
       self.filename = None
       self.master = master
       self.cbox_sheets = Combobox(master = master,values = myApp.importedSheets,postcommand = self.sheetnames).pack()

import pandas as pd
import os
import xlrd
from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter.ttk import Combobox
import tkinter as tk
import re
import numpy as np

class myApp:
    importedSheets = []
    us_sheets = None
    headers = []
    us_headers = None
    
    def UploadAction(self):
        self.filename = askopenfilename()
        print(self.filename)
    
    def sheetnames(self):
        global importedSheets
        self.xlssheets = xlrd.open_workbook(self.filename,on_demand=True)
        importedSheets = self.xlssheets.sheet_names()
        #print (importedSheets)
        return importedSheets
        
    def showsheets(self):
        return myApp.importedSheets()
    
    def __init__(self,master):
        self.filename = None
        self.master = master
    
        self.frame1 = Frame(master=master,relief=RAISED,borderwidth=1)
        self.frame1.pack(padx=10,pady=10)
        
        self.frame2 = Frame(master=master,relief=RAISED,borderwidth=1)
        self.frame2.pack(padx=10,pady=10)
        
        self.frame3 = Frame(master=master,relief=RAISED,borderwidth=1)
        self.frame3.pack(padx=10,pady=10)
        
        self.frame2a = Frame(master = self.frame2)
        self.frame2b = Frame(master = self.frame2)
        self.frame2r = Frame(master = self.frame2)
        self.frame2a.pack(side=TOP)
        self.frame2b.pack(side=LEFT)
        self.frame2r.pack(side=RIGHT)
        
        self.uploadLabel = Label(master = self.frame2a,text = 'Select the file you want to import',font=(None,12)).pack()
        self.uploadButton = Button(master = self.frame2a,text = 'Import',command = lambda:self.UploadAction()).pack()
       
        self.sheetLabel = Label(master = self.frame2b,text = 'Select the sheet to extract',font=(None,12)).pack(padx=15)
        
        self.cbox_sheets = Combobox(master = self.frame2b,values = myApp.importedSheets,postcommand = self.sheetnames).pack()
       
        self.headerLabel = Label(master = self.frame2r,text = 'Select the header with data',font=(None,12)).pack(padx=15)
        
        
if __name__ == '__main__':
    root = Tk()
    my_gui = myApp(root)
    root.mainloop()

Tags: importselfmasternonetkinterdeffilenameframe
1条回答
网友
1楼 · 发布于 2024-06-02 08:54:50

奇怪的是,代码对我来说仍然是个谜,但就这个问题而言,您应该如何编辑combobox声明:

self.cbox_sheets = Combobox(master = self.frame2b,values = self.importedSheets,postcommand = self.sheetnames)
self.cbox_sheets.pack()

也许您也应该为所有其他小部件执行此操作。现在只需将函数更改为:

 def sheetnames(self):
    self.xlssheets = xlrd.open_workbook(self.filename,on_demand=True)
    importedSheets = self.xlssheets.sheet_names()
    self.cbox_sheets.config(value=importedSheets) #updating the value of the combobox
    return importedSheets

也许showsheet()也应该有一个变化:

def showsheets(self):
    return self.importedSheets # because its is not a callable object so remove ()

另外,无论你在哪里说myApp.whatever,你都可以把它改成self.whatever,我认为这样说更准确。在这段代码上可能还有更多的改进要做,但是现在,这应该可以让您运行并回答您的问题

相关问题 更多 >