как сделать обновление холста tkinter? - PullRequest
1 голос
/ 08 июля 2020

Я закодировал гистограмму на холсте tkinter, и она получает данные из списка. Однако, когда я обновляю список, гистограмма не обновляется. Как я могу это исправить?

Мой код выглядит примерно так:

import tkinter as tk
import random

data = [20, 15, 10, 7, 5, 4, 3, 2, 1, 1, 0]

root = tk.Tk()
root.title("Bar Graph")

c_width = 600 # Define it's width
c_height = 400  # Define it's height
c = tk.Canvas(root, width=c_width, height=c_height, bg='white')
c.pack()

# 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

# A quick for loop to calculate the rectangle
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 = c_height - (y * y_stretch + y_gap)

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

    # Top right coordinates
    y1 = c_height - y_gap

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

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

root.mainloop()

def update():
    count = 0
    while count < 5:
         barChartData.append(random.randint(1, 11))
         count = count + 1
    update()
update()

Как я могу это исправить?

1 Ответ

0 голосов
/ 08 июля 2020

Вам нужно будет удалить старый график и создать новый каждый раз, когда вы измените числа.

Вы должны сделать это, переместив код для рисования гистограммы в функцию.

def draw_barchart(data):
    c.delete("all")
    for x, y in enumerate(data):
        x0 = x * x_stretch + x * x_width + x_gap
        y0 = c_height - (y * y_stretch + y_gap)
        x1 = x * x_stretch + x * x_width + x_width + x_gap
        y1 = c_height - y_gap
        c.create_rectangle(x0, y0, x1, y1, fill="red")
        c.create_text(x0 + 2, y0, anchor=tk.SW, text=str(y))

Затем вы можете вызывать это всякий раз, когда данные изменяются, передавая новые данные.

Однако есть и другие проблемы с вашим кодом. Вам нужно вызвать mainloop() в самом конце вашей программы, так как он не вернется, пока окно не будет уничтожено.

Вам также необходимо использовать after для периодического обновления данных или вызвать tkinter's update функция, позволяющая окну перерисовываться.

Вот как написать нижнюю часть кода для добавления данных и перерисовки графика каждые пять секунд:

def update():
    count = 0
    for i in range(5):
        data.append(random.randint(1, 11))
    c.delete("all")
    draw_barchart(data)
    root.after(5000, update)

update()

root.mainloop()
...