为什么即使使用跟踪和回调函数,GUI 也不会更新?



尽管我使用了tkinter变量、.trace方法和.update方法,但我还是很难弄清楚为什么下面的代码没有更新。

    from tkinter import *
    from math import sin, cos, pi
    master = Tk()

    people_size_var = IntVar()
    PeopleSize = Scale(master, from_=1, to=50, bd=3, length=153, variable=people_size_var)
    PeopleSize.grid(row=2, column=4, padx=10, pady=5)
    people_size_var.set(20)
    PeopleSize.config(highlightbackground="white")
    def update_canvas(*args):
        DisplayFrame.update()
    people_size_var.trace("w", update_canvas)
    a = 350
    b = 140
    ellipsePoints = [(a * cos(theta), b * sin(theta))
                     for theta in (pi*2 * i/number_of_people for i in range(number_of_people))]
    DisplayFrame = Canvas(master, bg="white", width=725, height=320)
    DisplayFrame.grid(row=0, columnspan=7, column=0, sticky='W', padx=5, pady=5)

    for i in range(number_of_people-1):
        Bonds = DisplayFrame.create_line(ellipsePoints[i][0]+355+(node_size/2), ellipsePoints[i][1]+155+(node_size/2),
                                 ellipsePoints[i+1][0]+355+(node_size/2), ellipsePoints[i+1][1] +155+(node_size/2),
                                 width=2, fill="black")
    for i in range(number_of_people):
        People = DisplayFrame.create_oval(ellipsePoints[i][0]+355, ellipsePoints[i][1]+155,
                                 ellipsePoints[i][0]+355 + node_size, ellipsePoints[i][1] + 155 + node_size,
                                 fill="yellow", outline="black", width=2)


    master.mainloop()

所以,正如你所看到的,我的代码在Canvas(DisplayFrame)中绘制了一些圆圈和圆圈之间的线。每次people_size_var更改时,我都会尝试更新画布,但它根本不起作用。跟踪确实有效,只是更新函数无效。我还不熟悉所有这些tkinter的东西,所以我真的不知道如何找出代码的问题。终端中没有任何错误。

我认为这里不需要使用update()方法。您已经运行了一个无限循环,即main(event)循环。你可以直接使用它。

由于你想在每次缩放时绘制整个东西,你需要在回调中放入绘图内容,但一定不要在每次回调中创建另一个画布,所以你需要将创建画布的内容放在函数之外,并每次清除画布以在其上绘制新内容。

我假设node_size是一个常数,number_of_people随尺度变化。

from tkinter import *
from math import sin, cos, pi
master = Tk()
def update_canvas(*args):
    number_of_people = people_size_var.get() #gets scale's value
    DisplayFrame.delete("all") #deletes every content from canvas
    a = 350
    b = 140
    ellipsePoints = [(a * cos(theta), b * sin(theta))
                     for theta in (pi*2 * i/number_of_people for i in range(number_of_people))]
    for i in range(number_of_people-1):
        Bonds = DisplayFrame.create_line(ellipsePoints[i][0]+355+(node_size/2), ellipsePoints[i][1]+155+(node_size/2),
                                 ellipsePoints[i+1][0]+355+(node_size/2), ellipsePoints[i+1][1] +155+(node_size/2),
                                 width=2, fill="black")
    for i in range(number_of_people):
        People = DisplayFrame.create_oval(ellipsePoints[i][0]+355, ellipsePoints[i][1]+155,
                                 ellipsePoints[i][0]+355 + node_size, ellipsePoints[i][1] + 155 + node_size,
                                 fill="yellow", outline="black", width=2)
people_size_var = IntVar()
PeopleSize = Scale(master, from_=1, to=50, bd=3, length=320, variable=people_size_var)
PeopleSize.grid(row=0, column=0, padx=10, pady=5)
people_size_var.set(20)
PeopleSize.config(highlightbackground="white")
node_size = 5
DisplayFrame = Canvas(master, bg="white", width=725, height=320)
DisplayFrame.grid(row=0, columnspan=7, column=1, sticky='W', padx=5, pady=5)
people_size_var.trace("w", update_canvas)
master.mainloop()

最新更新