Python:使用SQlite3数据库中的数据在Tkinter中构建条形图

2024-06-28 15:41:35 发布

您现在位置:Python中文网/ 问答频道 /正文

在我开始之前,我是新的堆栈溢出,所以如果我的问题格式不好,我道歉。同时,这也是我学校图书馆的一个A级学校项目,旨在帮助管理图书馆。我已经创建了一个表,其中包含学生以前借书的数据,名为“pastLoans”(see here ),我需要一种方法来找出哪些书在图书馆用户中最受欢迎,并将结果显示在条形图上。为此,我创建了一个SQL命令,该命令统计图书标题从“pastLoans”表的“book”列中出现的次数,目前我有2本书(see here)。在

由于Tk.帆布只有条形图,除了整数分别作为数据,所以我需要找到一种方法来拆分图书的名称和它在表中出现的次数,使用它出现的次数作为条形图上要显示的数据,而图书的名称作为X轴上的标签。在

目前,我已经编写了SQL命令,使用SQLite3中的“COUNT”函数从包含过去贷款数据的表中提取所需的数据,此外,我还为条形图编码了框架,并用列表中的示例数据(例如[1,2,3,4,5,…]

请注意,条形图成功地显示在Tkinter上,具有正确的数据值,不幸的是,我无法添加结果的图片,因为我没有足够的重复

我的代码如下:

    command = ("SELECT book,COUNT(book) AS cnt FROM pastLoans GROUP BY 
    book ORDER BY cnt DESC;")

    c.execute(command)
    result = c.fetchall()
    print (result)                            
    """This is the code for pulling the book name and amount of books 
    from the "pastLoans" as well as the book name, the result is this:

    >>> [('Book', 1), ('Harry Potter', 1)]


    This is my bar chart frame:"""

    data = [1, 2, 3, 4, 5] #The data used here is sample data.

    g_width = 900  # Define it's width
    g_height = 400  # Define it's height
    g = tk.Canvas(self, width=g_width, height=g_height)
    g.grid()

    # The variables below size the bar graph
    y_stretch = 15  # The highest y = max_data_value * y_stretch
    y_gap = 20  # The gap between lower canvas edge and x axis
    x_stretch = 10  # Stretch x wide enough to fit the variables
    x_width = 20  # The width of the x-axis
    x_gap = 20  # The gap between left canvas edge and y axis

    for x, y in enumerate(data):

        # coordinates of each bar

        # Bottom left coordinate
        x0 = x * x_stretch + x * x_width + x_gap

        # Top left coordinates
        y0 = g_height - (y * y_stretch + y_gap)

        # Bottom right coordinates
        x1 = x * x_stretch + x * x_width + x_width + x_gap

        # Top right coordinates
        y1 = g_height - y_gap

        # Draw the bar
        g.create_rectangle(x0, y0, x1, y1, fill="red")

        # Put the y value above the bar
        g.create_text(x0 + 2, y0, anchor=tk.SW, text=str(y))

Tags: the数据data图书馆isbarwidth条形图
1条回答
网友
1楼 · 发布于 2024-06-28 15:41:35

由于您已经完成了让tkinter显示条和上面的一些文本的所有工作,您只需迭代result而不是data

# Sort so that the most popular book is on the left
result.sort(key=lambda e: e[1], reverse=True)

for x, (name, y) in enumerate(result):
   ...

   # Put the name above the bar
   g.create_text(x0 + 2, y0, anchor=tk.SW, text=name)

您可能需要改变x_stretch变量,这样文本就不会重叠。在

相关问题 更多 >