У меня есть список 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()
ОК Я отредактировал весь свой код и отделил виджеты от макета для всей программы, но теперь список отображается при запуске, но, конечно, его пустой, поскольку я не ввел свое имя пользователя и пароль для подключения к базе данных. я больше не получаю ошибку, но и полоса прокрутки больше не связана с списком, теперь она сидит в правом нижнем углу главного окна? Я отредактирую код выше, чтобы вы могли видеть – jon141
. Чем больше я смотрю на это, тем больше я смущен, я предполагаю, что проблема связана с тем, что список заполняется функцией mysqlconnect, но эта функция не вызывается до тех пор, пока соединение кнопка нажата, поэтому в список нечего помещать, но поскольку окно уже есть и пустое, оно не обновляется и данные добавляются к нему после нажатия кнопки? означает ли это, что окно списка должно быть создано только после нажатия кнопки соединения? – jon141
@ jon141: нет, вы можете создать список раньше времени. Вы можете использовать метод 'insert' для вставки данных, когда захотите. Итак, сделайте запрос, а затем вставьте его в список. –