【问题标题】:Python: Building a Bar Chart in Tkinter with Data From an SQlite3 DatabasePython:使用来自 SQlite3 数据库的数据在 Tkinter 中构建条形图
【发布时间】:2017-04-01 13:12:17
【问题描述】:

在我开始之前,我是堆栈溢出的新手,所以如果我的问题格式不正确,我深表歉意。这也是我学校图书馆的 A-level 学校项目,旨在帮助图书馆的管理。我创建了一个表格,其中包含有关学生以前贷款的数据,名为“pastLoans”(see here ),我需要一种方法来找出哪些书在图书馆用户中最受欢迎,并在条形图上表示调查结果。为此,我创建了一个 SQL 命令来计算书名从“pastLoans”表的“书”列中出现的次数,目前我有 2 本书在那里 (see here)。

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

目前我已经使用 SQLite3 中的 'COUNT' 函数编写了 SQL 命令以从包含有关过去贷款的数据的表中提取我需要的数据,另外我已经为条形图编写了框架并测试了它是否适用列表中的样本数据,例如 [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))

【问题讨论】:

  • 我不太明白你的问题。您似乎想添加书名而不是 str(y),但您不知道如何遍历结果中的条目。
  • 我希望能够将书名(字符串)和书出现的次数(整数)分开,并绘制书名和 X 轴以及这本书出现在 Y 轴上的次数。

标签: python tkinter sqlite tkinter-canvas python-3.6


【解决方案1】:

由于您已经完成了让 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 变量,以使文本不会重叠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多