2014-01-30 2 views
0

У меня есть список tkinter, который должен отображать содержимое mysql information_schema, поэтому я могу выбрать, какую базу данных я хочу подключить, и список преобразуется в кортеж и отображается в списке, в окне списка появляется пустой, потому что я не подключен, но остается безлюдным после того как я подключить, а также полосы прокрутки не подключены к ListBox, но появляются в нижнем правом углу окна:Python Listbox показан ранее, но не заселен после запроса

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. Таким образом, lbox - None, и, таким образом, вы получаете ошибку NoneType object has no attribute yview, когда пролистница пытается синхронизировать со списком.

Вы всегда должны отделять создание виджетов от макета. Это позволяет избежать этой проблемы, и, на мой взгляд, это упрощает работу с вашим кодом, его понимание и поддержку.

+0

ОК Я отредактировал весь свой код и отделил виджеты от макета для всей программы, но теперь список отображается при запуске, но, конечно, его пустой, поскольку я не ввел свое имя пользователя и пароль для подключения к базе данных. я больше не получаю ошибку, но и полоса прокрутки больше не связана с списком, теперь она сидит в правом нижнем углу главного окна? Я отредактирую код выше, чтобы вы могли видеть – jon141

+0

. Чем больше я смотрю на это, тем больше я смущен, я предполагаю, что проблема связана с тем, что список заполняется функцией mysqlconnect, но эта функция не вызывается до тех пор, пока соединение кнопка нажата, поэтому в список нечего помещать, но поскольку окно уже есть и пустое, оно не обновляется и данные добавляются к нему после нажатия кнопки? означает ли это, что окно списка должно быть создано только после нажатия кнопки соединения? – jon141

+0

@ jon141: нет, вы можете создать список раньше времени. Вы можете использовать метод 'insert' для вставки данных, когда захотите. Итак, сделайте запрос, а затем вставьте его в список. –

Смежные вопросы