带有 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 列表框的主要内容,如果未能解决你的问题,请参考以下文章

带有 MySQL 数据库的 Python 3.4.0

python MySQLdb:在没有证书的情况下使用ssl

使用带有外部变量的python将数据插入mysql

Python之MySQLdb

Python MySQLdb 模块

python 2.x MysqlDB模块使用