带有 MySQLdb 的 Python Tkinter 列表框
Posted
技术标签:
【中文标题】带有 MySQLdb 的 Python Tkinter 列表框【英文标题】:Python Tkinter listbox with MySQLdb 【发布时间】:2013-11-07 11:16:42 【问题描述】:这是我在 python 中的第一个程序,我正在尝试创建一个程序,它将 mysql 通讯簿与星号服务器连接并进行调用。 “星号代码部分”没问题,我稍后会添加,但问题是我在 Tkinter 中有一个列表框,我想用从 mysqldb 查询中检索到的值填充它。 我只能向列表框添加一个值,但如果我打印结果是正确的。 我该如何解决这个问题?我想我将不得不做一个 for 循环。 稍后我将不得不知道如何从列表中选择一个值并存储在一个变量中。
from Tkinter import *
import MySQLdb
root = Tk()
root.title("PyCall")
myContainer = Frame(root)
myContainer.pack(side=TOP, expand=YES, fill=BOTH)
db = MySQLdb.connect("localhost",port=3306, user="root", passwd="mypass", db="test" )
cursor = db.cursor()
cursor.execute("SELECT * FROM utenti")
db.commit()
numrows = int(cursor.rowcount)
for x in range(0,numrows):
row = cursor.fetchone()
print row[1]
listbox = Listbox(root)
listbox.pack()
listbox.insert(END, row[1])
root.mainloop()
db.close()
【问题讨论】:
【参考方案1】:如果这是您使用 Python 编写的第一个程序,那么您就有了一个良好的开端!您的问题与 MySQL 几乎没有关系,而且您似乎对此处理得很好,所以我将不理会这个问题,只关注您遇到的 Tkinter 问题。反正我没有 MySQL 数据库可以测试 :)
在 GUI 应用程序中(至少在 Tkinter 中)通常是一个好主意,使用 Tk 根框架作为应用程序的主容器来设置您自己的应用程序类。这样做的原因是,GUI 总是有点小手,它们只是真实应用程序数据的一个门面,而真实数据需要某个地方存在。通过创建您自己的应用程序类,您可以通过self
为该数据提供一个主页。
好了,所有无聊的东西都说完了,让我们来构建一些东西吧:
import Tkinter
class Application(Tkinter.Frame):
def __init__(self, master):
Tkinter.Frame.__init__(self, master)
self.master.minsize(width=256, height=256)
self.master.config()
self.pack()
self.main_frame = Tkinter.Frame()
self.some_list = [
'One',
'Two',
'Three',
'Four'
]
self.some_listbox = Tkinter.Listbox(self.main_frame)
# bind the selection event to a custom function
# Note the absence of parentheses because it's a callback function
self.some_listbox.bind('<<ListboxSelect>>', self.listbox_changed)
self.some_listbox.pack(fill='both', expand=True)
self.main_frame.pack(fill='both', expand=True)
# insert our items into the list box
for i, item in enumerate(self.some_list):
self.some_listbox.insert(i, item)
# make a label to show the selected item
self.some_label = Tkinter.Label(self.main_frame, text="Welcome to SO!")
self.some_label.pack(side='top')
# not really necessary, just make things look nice and centered
self.main_frame.place(in_=self.master, anchor='c', relx=.5, rely=.5)
def listbox_changed(self, *args, **kwargs):
selection_index = self.some_listbox.curselection()
selection_text = self.some_listbox.get(selection_index, selection_index)
self.some_label.config(text=selection_text)
root = Tkinter.Tk()
app = Application(root)
app.mainloop()
希望这对您有所帮助,并享受构建 GUI 的乐趣!
【讨论】:
感谢 Pathétique,您的代码运行良好!现在我必须在 self.some_list [...] 中插入查询或查询结果。我试过但没有成功。请帮助一个可怜的菜鸟! 我只是使用了一个普通的 Python 列表,你可以使用append
添加项目。 See the Python docs.
解释器告诉我列表框没有'append'属性
self.some_list
是一个 Python 列表对象,可以使用 append
添加到,self.some_listbox
是一个 Tkinter.Listbox 对象,并且可以使用 insert
添加项目给定您想要的索引插入字符串和要插入的字符串......就像我上面的for循环一样。
解决了!我是这样改代码的:self.some_list = [ 'ADDRESS BOOK' ] db = MySQLdb.connect("localhost",port=3306, user="root", passwd="mypass", db="test" ) cursor = db.cursor() cursor.execute("SELECT name FROM users") db.commit() numrows = int(cursor.rowcount) for i in range(0,numrows): row = cursor.fetchone() if (row): self.some_list.append(row[0])
谢谢大家的帮助!我真的很感激以上是关于带有 MySQLdb 的 Python Tkinter 列表框的主要内容,如果未能解决你的问题,请参考以下文章