Listbox更新全局列表内容 [英] Listbox update global list contents

查看:313
本文介绍了Listbox更新全局列表内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了一个GUI,用户可以在其中导入CSV文件,并可以点击对这些文件执行功能的各种按钮,例如。绘制CSV,查看CSV的迷你表等。每当导入一个文件时,它会附加到一个名为 file_list 的全局列表中,我的函数会对这些文件通过这个全局列表。

I'm making a GUI where users import CSV files, and can click on various buttons that carry out functions on these files, e.g. graphing the CSV, viewing a mini table of the CSV, etc. Whenever a file is imported, it gets appended to a global list called file_list, and my functions act on the files via this global list.

我有一个列表框我在大型机中显示我想显示列表的用户已导入的文件。我使用一个for循环在 Listbox 中显示每个文件的名称,但它似乎并不工作。任何提示,如何我可以去显示这些文件名?这里是我为主框架列表框

I have a Listbox I am displaying in the mainframe where I want to display a list of files the user has imported. I'm using a for loop to display the name of each file in the Listbox, but it just doesn't seem to be working. Any tips on how I could go about displaying these file names? Here's the code I have for the main Frame and Listbox:

from matplotlib import pyplot
from csv import reader
from dateutil import parser
import tkinter as tk
from tkinter import ttk  
from tkinter.filedialog import askopenfilename
import pandas as pd
from tkinter import Text, Scrollbar, Toplevel

file_list = []

# i'm just including openfile here, which is essentially an import button. 

def openfile():
    name= askopenfilename()
    # file_list is appended with name everytime openfile is clicked
    rev = (name[::-1])
    i = rev.index('/')
    name = ((rev[:i])[::-1])
    file_list.append(name)
    main_dataview.insert(0, name)
    with open(name, 'r') as f:
        data = list(reader(f))
    popup = tk.Tk()
    popup.wm_title("!")
    # popups a message notifying what was imported
    label = ttk.Label(popup, text=" %s was just imported" % (name), font=NORM_FONT)
    label.pack(side="top", fill="x", pady=10)
    B1 = ttk.Button(popup, text="Okay", command = popup.destroy)
    B1.pack()
    center(popup)
    popup.mainloop()

class CODAQ(tk.Tk):

    def __init__(self, *args, **kwargs):  
        tk.Tk.__init__(self, *args, **kwargs)
        tk.Tk.wm_title(self, "CODAQ")

        # main frame
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        # creates the menubar at the top of the window  
        menubar = tk.Menu(container)

        # import menu for importing csv files, initializes openfile() functions
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(label="Import a CSV File", command = openfile)
        filemenu.add_command(label="Remove", command = remove)
        menubar.add_cascade(label= "File", menu=filemenu)

        # plot menu for creating graphs and figures    
        Plot = tk.Menu(menubar, tearoff =0 )
        Plot.add_command(label="Plot Most Recent CSV", command= popupgraph)
        Plot.add_command(label="Plot an Imported CSV", command = dataselection_graph)
        menubar.add_cascade(label="Plot", menu=Plot)

        # viewdata menu for viewing data in a table
        ViewData = tk.Menu(menubar, tearoff = 0)
        ViewData.add_command(label="View most recent CSV" , command = viewcsv)
        ViewData.add_command(label="View an Imported CSV",command = dataselection_viewcsv)
        ViewData.add_command(label="View most recent CSV Variables",command = variable_extractor)
        ViewData.add_command(label="View an Imported CSV's Variables", command = variable_extractor_sel)
        menubar.add_cascade(label = "View Data", menu = ViewData)

        tk.Tk.config(self, menu=menubar)

        self.frames = {}
        # cycles through screens 
        for F in (WelcomeScreen, MainPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(WelcomeScreen)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

    # WelcomeScreen Object
class WelcomeScreen(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        label1 = ttk.Label(self, text="Welcome to CODAQ", font=LARGE_FONT)
        label2 = ttk.Label(self, text="Begin by importing your Data", font=MEDIUM_FONT)
        label1.pack(pady=0,padx=5)
        label2.pack(pady=15,padx=10)

        button = ttk.Button(self, text="Enter CODAQ",
                        command=lambda: controller.show_frame(MainPage))
        button.pack()


    # mainpage object
class MainPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text="My Data", font=LARGE_FONT)
        label.grid(row= 0, column = 0, pady = (10,15), padx = (90,0))

        main_dataview = tk.Listbox(self, font=NORM_FONT)
        main_dataview.config(width = 44, borderwidth = 7)

        main_dataview.grid(row=1, column=0, columnspan = 2)

        # scroll bar functionality     
        scroll_y = Scrollbar(self, orient="vertical", command=main_dataview.yview)
        scroll_y.grid(row=1, column=2, sticky="nsew")
        # bind txt to scrollbar
        main_dataview.configure(yscrollcommand=scroll_y.set)


app = CODAQ()
# size of screen 
app.minsize(width=1000, height = 500)
app.mainloop()


推荐答案

我使用 self.main_dataview 可以访问 c $ c>从其他函数/类。

I use self.main_dataview to have access to Listbox from other functions/classes.

我在 CODAQ 中放置 openfile()可以访问 self.frames self.frames [Mainpage] .main_dataview - 现在我可以插入导入的文件

I put openfile() inside class CODAQ to have access to self.frames and to self.frames[Mainpage].main_dataview - so now I can insert imported files

self.frames[MainPage].main_dataview.insert(0, name)






BTW: tkinter code> Tk()窗口和一个 mainloop() - 所以使用 Toplevel 创建弹出窗口并删除第二个 mainloop()。或使用现有的消息窗口


BTW: tkinter should have only one Tk() window and one mainloop() - so use Toplevel to creat popup window and remove second mainloop(). Or use existing message windows like

tkinter.messagebox.showinfo('!', " %s was just imported" % (name)) 

要获取没有完整路径的文件名,您可以使用

To get file name without full path you can use

name = os.path.basename(name)


$ b b




工作代码:


Working code:

from matplotlib import pyplot
from csv import reader
from dateutil import parser
import pandas as pd

import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
from tkinter import Text, Scrollbar, Toplevel
from tkinter.messagebox import showinfo

import os.path

MEDIUM_FONT = (20, )
LARGE_FONT  = (20, )
NORM_FONT   = (20, )

# i'm just including openfile here, which is essentially an import button.

class CODAQ(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        tk.Tk.wm_title(self, "CODAQ")

        # size of screen
        self.minsize(width=1000, height = 500)

        self.file_list = [] # <--

        # main frame
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        # creates the menubar at the top of the window
        menubar = tk.Menu(container)

        # import menu for importing csv files, initializes openfile() functions
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(label="Import a CSV File", command=self.openfile) # <--
        #filemenu.add_command(label="Remove", command = remove)
        menubar.add_cascade(label= "File", menu=filemenu)

        # plot menu for creating graphs and figures
        Plot = tk.Menu(menubar, tearoff =0 )
        #Plot.add_command(label="Plot Most Recent CSV", command= popupgraph)
        #Plot.add_command(label="Plot an Imported CSV", command = dataselection_graph)
        menubar.add_cascade(label="Plot", menu=Plot)

        # viewdata menu for viewing data in a table
        ViewData = tk.Menu(menubar, tearoff = 0)
        #ViewData.add_command(label="View most recent CSV" , command = viewcsv)
        #ViewData.add_command(label="View an Imported CSV",command = dataselection_viewcsv)
        #ViewData.add_command(label="View most recent CSV Variables",command = variable_extractor)
        #ViewData.add_command(label="View an Imported CSV's Variables", command = variable_extractor_sel)
        menubar.add_cascade(label = "View Data", menu = ViewData)

        tk.Tk.config(self, menu=menubar)

        self.frames = {}
        # cycles through screens
        for F in (WelcomeScreen, MainPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(WelcomeScreen)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


    def openfile(self):
        name = askopenfilename()

        # file_list is appended with name everytime openfile is clicked
        #rev = (name[::-1])
        #i = rev.index('/')
        #name = ((rev[:i])[::-1])

        name = os.path.basename(name) # <---

        self.file_list.append(name)

        self.frames[MainPage].main_dataview.insert(0, name)  # <--

        with open(name, 'r') as f:
            data = list(reader(f))

        showinfo('!', " %s was just imported" % (name))

        #popup = tk.Toplevel() # <--
        #popup.wm_title("!")
        # popups a message notifying what was imported
        #label = ttk.Label(popup, text=" %s was just imported" % (name), font=NORM_FONT)
        #label.pack(side="top", fill="x", pady=10)
        #B1 = ttk.Button(popup, text="Okay", command=popup.destroy)
        #B1.pack()
        #center(popup)

# --- WelcomeScreen Object ---

class WelcomeScreen(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        label1 = ttk.Label(self, text="Welcome to CODAQ", font=LARGE_FONT)
        label2 = ttk.Label(self, text="Begin by importing your Data", font=MEDIUM_FONT)
        label1.pack(pady=0,padx=5)
        label2.pack(pady=15,padx=10)

        button = ttk.Button(self, text="Enter CODAQ",
                        command=lambda: controller.show_frame(MainPage))
        button.pack()

# --- mainpage object ---

class MainPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text="My Data", font=LARGE_FONT)
        label.grid(row= 0, column = 0, pady = (10,15), padx = (90,0))

        self.main_dataview = tk.Listbox(self, font=NORM_FONT)
        self.main_dataview.config(width = 44, borderwidth = 7)

        self.main_dataview.grid(row=1, column=0, columnspan = 2)

        # scroll bar functionality
        scroll_y = Scrollbar(self, orient="vertical", command=self.main_dataview.yview)
        scroll_y.grid(row=1, column=2, sticky="nsew")
        # bind txt to scrollbar
        self.main_dataview.configure(yscrollcommand=scroll_y.set)

# --- main ---

app = CODAQ()
app.mainloop()

这篇关于Listbox更新全局列表内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆