2014-01-30 13 views
0

我有一個tkinter列表框,應該列出mysql information_schema的內容,因此我可以選擇我想要連接的數據庫列表轉換爲元組並顯示在列表框中,因爲我沒有連接列表框顯示爲空,但仍無人居住後,我進行連接,也將滾動條沒有連接到列表框,但出現在窗口的右下方:之前顯示的Python列表框,但沒有請求後填充

def mysqlConnect(): 
    import pymysql 
    sqlUsr = MysqlUsr.get() 
    sqlpwd = Mysqlpwd.get() 
    conn = pymysql.connect(host='192.168.0.27', user= sqlUsr, passwd=sqlpwd, db='information_schema') 
    cursor = conn.cursor() 
    cursor.execute("SELECT SCHEMA_NAME FROM SCHEMATA") 
    schema_names = cursor.fetchall() 
    schema_tuple = tuple(schema_names) 
    countrynames = (schema_tuple) 
    cnames = (countrynames) 
    conn.close() 

    # Figure out which country is selected, which gift is selected with the 
    # radiobuttons, "send the gift", and provide feedback that it was sent. 
    def sendGift(*args): 
     idxs = lbox.curselection() 
     if len(idxs)==1: 
      idx = int(idxs[0]) 
    lbox.see(idx) 
    name = countrynames[idx] 
    # Gift sending left as an exercise to the reader 
    sentmsg.set("%s %s" % (commands[gift.get()], name)) 

    # Note we're using the StringVar() 'cnames', constructed from 'countrynames' 

    usertxt=Label(mainframe, text="User =") 
    userlabel=Label(mainframe,text=usr) 
    pathlabel=Label(mainframe, text="Project directory path is P:\\Projects_2013\\") 
    projectdetaillabel=Label(mainframe, text="Project detail:") 
    enternewname=Label(mainframe, text="Enter NEW project name:") 
    ttk.Entry(mainframe, textvariable= assetVar).grid(column=4, row=2,columnspan=2, sticky=(W,E)) 
    createbutton=Button(mainframe, width=18,text="Create Folders", command=genAsset) 
    selectlabel=Label (mainframe, text='Select an existing project:') 
    browsebutton=Button(mainframe, width= 18,text="Browse", command=sel_Browse) 
    prjtnm = Entry(mainframe, width=50) 
    optionlabel=Label (mainframe, text="Project options:") 
    completedbutton=Button(mainframe, text="Mark as completed", command=fldrRename) 
    openbutton=Button(mainframe, width=18,text="Open Directory", command=Open_Win_Explorer_and_Select_Dir) 
    shortcutlabel=Label(mainframe, text="Program Shortcuts:") 
    xenonbutton=Button(mainframe, image=xenonimage, command=opn_xenon) 
    wdebutton=Button(mainframe, image=webdateimage, command=opn_data_extr) 
    wcebutton=Button(mainframe, image=webcontimage, command=opn_content_extr) 
    htbutton=Button(mainframe, image=htimage, command=opn_ht) 
    mysqllabel=Label(mainframe, text="Mysql:") 
    mysqlbutton=Button(mainframe, width=18,text="MySql connect:",command=mysqlConnect) 
    mysqlusr=Label(mainframe, text="Mysql Username:") 
    mysqlusrentry=Entry(mainframe, width=18,textvariable= MysqlUsr) 
    mysqlpasswordlabel=Label(mainframe, text="Mysql Password:") 
    mysqlpwdentry=Entry(mainframe, width=18,textvariable= Mysqlpwd) 
    lbox = Listbox(mainframe, listvariable=cnames, height=6) 
    g0 = ttk.Label(mainframe, text="Select Database") 
    g1 = ttk.Label(mainframe, text="Option:") 
    g2 = ttk.Radiobutton(mainframe, text=commands['dbconnect'], variable=gift, value='dbconnect') 
    g3 = ttk.Radiobutton(mainframe, text=commands['dbdelete'], variable=gift, value='dbdelete') 
    send = ttk.Button(mainframe, text='Apply', command=(sendGift), default='active') 
    sentlbl = ttk.Label(mainframe, textvariable=sentmsg, anchor='center') 
    status = ttk.Label(mainframe, textvariable=statusmsg, anchor=W) 

    # create a vertical scrollbar to the right of the listbox 
    yscroll = tk.Scrollbar(command=lbox.yview, orient=tk.VERTICAL) 
    yscroll.grid(row=15, column=3, sticky='ns') 
    lbox.configure(yscrollcommand=yscroll.set) 


    #grid all the above 
    usertxt.grid(column=1, row=1, sticky=E) 
    userlabel.grid(column=2, row=1, sticky=W) 
    pathlabel.grid(column=4, columnspan=2, row=1, sticky=W) 
    projectdetaillabel.grid(column=1, row=2, sticky=E) 
    enternewname.grid(column=2, row=2, columnspan=2, sticky=E, pady=15) 
    lbox.grid(column=3, row=15, rowspan=6, sticky=(N,S,E,W)) 
    prjtnm.grid(row=3,column=4, columnspan=2) 
    createbutton.grid(column=6, row=2, sticky=E, padx=10) 
    selectlabel.grid(column=2,row=3,columnspan=2, sticky=E, pady=10) 
    browsebutton.grid(row=3,column=6, sticky=W, padx=10) 
    optionlabel.grid(row=4, column=2, columnspan=2, sticky=E) 
    completedbutton.grid(row=4,column=4, sticky=W, padx=2) 
    openbutton.grid(row=4,column=5, sticky=E, padx=2) 
    shortcutlabel.grid(column=1, row=6,sticky=E, pady=60) 
    xenonbutton.grid(row=6, column=3,sticky=E,) 
    wdebutton.grid(row=6, column=4) 
    wcebutton.grid(row=6, column=5) 
    htbutton.grid(row=6,column=6,sticky=W,) 
    mysqllabel.grid(column=1, row=8,sticky=E) 
    mysqlbutton.grid(row=8, column=6, sticky=E, padx=10) 
    mysqlusr.grid(row=8, column=2, sticky=E) 
    mysqlusrentry.grid(row=8, column=3, sticky=W) 
    mysqlpasswordlabel.grid(row=8, column=4, sticky=E) 
    mysqlpwdentry.grid(row=8, column=5, sticky=W) 
    g0.grid(column=3, row=14, sticky=W) 
    g1.grid(column=4, row=14, sticky=W) 
    g2.grid(column=4, row=16, sticky=W, padx=20, pady=10); 
    g3.grid(column=4, row=17, sticky=W, padx=20); 
    send.grid(column=5, row=16, sticky=E) 
    sentlbl.grid(column=3, row=17, columnspan=2, sticky=N, pady=5, padx=5); 
    status.grid(column=4, row=18, columnspan=2, sticky=(W,E)); 
    lbox.bind('<Double-1>', sendGift) 
    root.bind('<Return>', sendGift) 

    # Colorize alternating lines of the listbox 
    #for i in range(0,len(countrynames),2): 
    # lbox.itemconfigure(i, background='#f0f0ff') 

    # Set the starting state of the interface, including selecting the 
    # default command to connect, and clearing the messages. Select the first 
    # country in the list; because the <<ListboxSelect>> event is only 
    # generated when the user makes a change, we explicitly call showPopulation. 
    gift.set('dbconnect') 
    sentmsg.set('') 
    statusmsg.set('') 
    lbox.selection_set(0) 


    #add mysql pre-programmes queries here: 
    ttk.Button(mainframe, width=18, text="Mysql query 1").grid(row=120, column=2, sticky=E) 

    root.mainloop() 

回答

0

您報告錯誤莖從這一行開始:

lbox = Listbox(mainframe, listvariable=cnames, height=6).grid(column=3, row=13, rowspan=6, sticky=(N,S,E,W)) 

在python中,如果你做foo=bar().baz()foo得到鏈中最後一個函數的結果。因此,當你做lbox = Listbox(...).grid(...)時,lbox得到對網格的調用結果,網格總是None。因此,lboxNone,因此滾動條嘗試與列表框同步時會出現錯誤NoneType object has no attribute yview

您應該始終從佈局中分離創建小部件。它避免了這個問題,並且在我看來,它使您的代碼更易於編寫,理解和維護。

+0

好的我編輯了我的所有代碼,並從整個程序的佈局中分離出小部件,但現在列表框顯示在啓動時,但當然它是空的,因爲我沒有輸入用戶名和密碼來連接數據庫我不再有錯誤,但滾動條不再鏈接到列表框,它現在坐在主窗口的右下角?我會編輯上面的代碼,所以你可以看到 – jon141

+0

越多我盯着這個我越困惑,我假設這個問題是因爲列表框由mysqlconnect函數填充,但該函數直到connect按鈕被按下,因此沒有東西放在列表框中,但由於框已經存在並且爲空,它不會被刷新並且在按下按鈕之後將數據添加到它中?這是否意味着列表框只能在連接按鈕被按下後才能創建? – jon141

+0

@ jon141:不,您可以提前創建列表框。您可以使用'insert'方法隨時插入數據。所以,做一個查詢,然後插入到列表框中。 –