2017-08-25 52 views
-1

我正在用列表框來構建一個python tkinter軟件,但列表框不會從列表(即在一個字典內)通過for循環加載值。Python tkinter - numpy - Listbox不加載值

該字典存儲在一個numpy文件中,具有以下結構:m={"subject":["subjectname"], ...}。但我不認爲這個問題是由文件或字典,因爲它與TTK組合框效果很好引起...

這裏是我的代碼:

import os.path 
import numpy as np 
global m 
global fn_sub 
global path 
m={} 
# filename for the file to save 
fn_sub = "subjects.npy" 

path = os.path.expanduser(r'~\Documents\School Life Diary') 
# check the directory does not exist 
if not(os.path.exists(os.path.join(path,fn_sub))): 
    # write the file in the new directory 
    np.save(os.path.join(path, fn_sub), m) 
from tkinter import * 
import tkinter.messagebox 
from tkinter.ttk import * 
global old_mat 
def inizializza(): 
     try: 
      m=np.load(os.path.join(path, fn_sub)).item() 
     except ValueError: 
      m={} 
### other code... ### 
def creaFinestra(): 
    global wim 
    wim=Toplevel() 
    inizializza() 
    wim.title("Materie - School Life Diary") 
    wim.iconbitmap("sld_icon_beta.ico") 
    wim.geometry("%dx%d+%d+%d" % (325, 325, 600, 200)) 
    s=Style() 
    try: 
     s.theme_use("vista") 
    except: 
     s.theme_use() 
    fim=Frame(wim) 
    fim.pack() 
    global lb 
    lb=Listbox(fim,selectmode="SINGLE") 
    lb.pack(padx=10,pady=10) 
    for e in m: 
     lb.insert("end",*m[e]) 
    ''' I also used this, but doesn't work... 
    for e in m: 
     lb.insert(list(m.keys()).index(e),m[e][0]) 
    ''' 
    fim2=Frame(wim) 
    fim2.pack() 
    imageAdd=PhotoImage(file=r"images/add_FAB.png") 
    imageMod=PhotoImage(file=r"images/mod_FAB.png") 
    imageDel=PhotoImage(file=r"images/trash_FAB.png") 
    bAdd=Button(fim2,image=imageAdd,command=add) 
    bAdd.image=imageAdd 
    bMod=Button(fim2,image=imageMod,command=edit) 
    bDel=Button(fim2,image=imageDel,command=delete) 
    bAdd.grid(row=0,column=0,padx=10,pady=10) 
    bMod.grid(row=0,column=1,padx=10,pady=10) 
    bDel.grid(row=0,column=2,padx=10,pady=10) 
    wim.mainloop() 

你能幫助我嗎? 謝謝

+0

「不加載值」是什麼意思?你有錯誤嗎?它是否加載了錯誤的數據?它是否以錯誤的格式加載正確的數據?你是否證實'm [e]'包含你認爲它包含的內容? –

+0

1.我指的是列表框爲空,並且數據不會被添加到列表框 2.否 3.無 4.無 5.我用'打印試圖(M [E])'但它不不打印...似乎for循環不會運行... –

+0

您需要做的第一件事是驗證您的變量中有數據。如果沒有,問題不在列表框中。 –

回答

1

發現問題: Numpy加載字典,但變量m將永遠丟失,如果我以前不添加global m。 所以我重新檢查了代碼並添加了更多控件。這裏是全功能代碼:

import os.path 
import numpy as np 
global m 
m={} 
global fn_sub 
global path 
# filename for the file you want to save 
fn_sub = "subjects.npy" 

path = os.path.expanduser(r'~\Documents\School Life Diary') 
# check the directory does not exist 
if not(os.path.exists(os.path.join(path,fn_sub))): 
    # write the file in the new directory 
    m={} 
    np.save(os.path.join(path, fn_sub), m) 

from tkinter import * 
import tkinter.messagebox 
from tkinter.ttk import * 
#Variabili globali 
global old_mat 

def inizializza(): 
    try: 
     global m 
     m=np.load(os.path.join(path, fn_sub)).item() 
    except ValueError: 
     m={} 
def Salvataggio(mode,var): 
    try: 
     if mode=="add": 
      m[var.get()]=[var.get()] 
      wa.destroy() 
     elif mode=="edit": 
      m[old_mat][0]=var.get() 
      we.destroy() 
     elif mode=="del": 
      del m[old_mat] 
     np.save(os.path.join(path, fn_sub), m) 
     tkinter.messagebox.showinfo(title="Successo!", message="Salvataggio effettuato con successo!") 
     wim.destroy() 
     creaFinestra() 
    except: 
     tkinter.messagebox.showerror(title="Errore!", message="Si è verificato un errore, riprovare oppure contattare lo sviluppatore") 

def delete(): 
    if lb.get(lb.curselection())=="": 
     tkinter.messagebox.showerror(title="Nessuna materia selezionata", 
            message="ERRORE! Nessuna materia selezionata!") 
     return "" 
    global old_mat 
    old_mat=lb.get(lb.curselection()) 
    try: 
     scelta=tkinter.messagebox.askyesno(title="Conferma eliminazione", 
           message="Si è sicuri di voler eliminare la materia "+old_mat+"?") 
    except TypeError: 
     scelta=tkinter.messagebox.askyesno(title="Conferma eliminazione", 
           message="Si è sicuri di voler eliminare la materia "+old_mat[0]+"?") 
    if scelta==True: 
     Salvataggio("del","") 
    else: 
     return "" 
def add(): 
    global wa 
    wa=Toplevel() 
    wa.title("Inserisci materia - School Life Diary") 
    wa.iconbitmap("sld_icon_beta.ico") 
    wa.geometry("%dx%d+%d+%d" % (200, 200, 600, 200)) 
    l=Label(wa, text="Inserire la nuova materia") 
    l.pack(padx=10,pady=10) 
    var=StringVar(value="") 
    e=Entry(wa, textvariable=var) 
    e.pack(padx=10,pady=10) 
    b=Button(wa, text="SALVA", command=lambda: Salvataggio("add",var)) 
    b.pack(padx=10,pady=10) 
    wa.mainloop() 

def edit(): 
    global old_mat 
    old_mat=lb.get(lb.curselection()) 
    global we 
    we=Toplevel() 
    we.title("Modifica materia - School Life Diary") 
    we.iconbitmap("sld_icon_beta.ico") 
    we.geometry("%dx%d+%d+%d" % (450, 200, 600, 200)) 
    l=Label(we, text="Inserire la materia da modificare (Vecchia materia: "+old_mat+")") 
    l.pack(padx=10,pady=10) 
    var=StringVar(value="") 
    e=Entry(we, textvariable=var) 
    e.pack(padx=10,pady=10) 
    b=Button(we, text="SALVA", command=lambda: Salvataggio("edit",var)) 
    b.pack(padx=10,pady=10) 
    we.mainloop() 
def riempiListbox(lb): 
    for e in m: 
     lb.insert(list(m.keys()).index(e),m[e][0]) 
def creaFinestra(): 
    global wim 
    wim=Toplevel() 
    inizializza() 
    wim.title("Materie - School Life Diary") 
    wim.iconbitmap("sld_icon_beta.ico") 
    wim.geometry("%dx%d+%d+%d" % (325, 325, 600, 200)) 
    s=Style() 
    try: 
     s.theme_use("vista") 
    except: 
     s.theme_use() 
    fim=Frame(wim) 
    fim.pack() 
    global lb 
    lb=Listbox(fim,selectmode="SINGLE") 
    lb.pack(padx=10,pady=10) 
    riempiListbox(lb) 
    fim2=Frame(wim) 
    fim2.pack() 
    imageAdd=PhotoImage(file=r"images/add_FAB.png") 
    imageMod=PhotoImage(file=r"images/mod_FAB.png") 
    imageDel=PhotoImage(file=r"images/trash_FAB.png") 
    bAdd=Button(fim2,image=imageAdd,command=add) 
    bAdd.image=imageAdd 
    bMod=Button(fim2,image=imageMod,command=edit) 
    bDel=Button(fim2,image=imageDel,command=delete) 
    bAdd.grid(row=0,column=0,padx=10,pady=10) 
    bMod.grid(row=0,column=1,padx=10,pady=10) 
    bDel.grid(row=0,column=2,padx=10,pady=10) 
    wim.mainloop() 

感謝您的幫助!