如何在 tkinter slider.set 方法中设置一个值?

How to set a value in the tkinter slider.set method?

我正在尝试模拟一个恒星系统。我的目标是通过滑块小部件来操纵参数,请参阅下面的(简化的)代码。我代码中的滑块小部件接受太阳质量的新值,该值是通过 StellarSys 实例设置的。然而,slider.set 方法失败并出现 TypeError:'NoneType' object is not subscriptable。有人有解决方案或可以解释我做错了什么吗?非常感谢。

import tkinter as tk
import math     

class Space(tk.Frame):
    def __init__(self, master, size, bg=None):
        super().__init__(master)
        frame = tk.Frame(self, border=5)
        frame.pack()
        self.width, self.height = size
        self.canvas = tk.Canvas(frame, width=self.width,height=self.height,
                                borderwidth=0, highlightthickness=0, bg=bg)
        self.canvas.pack()
        self.bodies = None

    def place_bodies(self):
        for body in self.bodies:
            x1, y1 = int(body.loc[0]-body.size/2.0),int(body.loc[1]-body.size/2.0) 
            x2, y2 = x1 + body.size, y1 + body.size
            body.tk_id = self.canvas.create_oval(x1, y1, x2, y2, fill=body.color)

class SpaceBody:
    def __init__(self, **kwargs):
        self.name  = kwargs['name']
        self.size  = kwargs['size']
        self.mass  = kwargs['mass']
        self.loc   = kwargs['loc']
        self.speed = kwargs['speed']
        self.color = kwargs['color']
        self.dxdy  = (0,0)
        self.tk_id = None

    def __repr__(self):
        return f"\n{self.name} is {self.color}"

class Dashboard(tk.Frame):
    def __init__(self, master, bg=None):    
        super().__init__(master)
        frame = tk.Frame(self, border=5, bg=bg)
        frame.pack()
        sun_frame=tk.Frame(frame)
        sun_frame.grid(row=1)
        w, h = 15, 3

        tk.Label(sun_frame, text = '').grid(row=0)
        tk.Label(sun_frame, text = 'SUN MASS').grid(row=1)
        self.sun_mass = tk.Scale(sun_frame, from_=0, to=1000, orient='horizontal')
        self.sun_mass.bind("<ButtonRelease-1>", self.update)
#        self.sun_mass.set(500) # this works
        self.sun_mass.set(space.bodies[0].mass) # This doesn't work
        self.sun_mass.grid(row=2)

    def update(self, event):
        space.bodies[0].mass = self.sun_mass.get()
        print(space.bodies[0].mass)


class StellarSys:
    def __init__(self):
        sun   = SpaceBody(name='Sun',  size=30, mass=500, loc=(500,400),speed=(0, 0), color='yellow')
        earth = SpaceBody(name='Earth',size=15, mass=1,  loc=(500,200),speed=(15,0), color='green')
        space.bodies = [sun, earth]
        space.place_bodies()
               
# MAIN
root = tk.Tk()
root.title('UNIVERSE')
size = (1000, 800)
space = Space(root, size, bg='black')
space.grid(row=0, column = 0,sticky="nsew")
dashboard = Dashboard(root)
dashboard.grid(row=0, column = 1,sticky="nsew")
stellarsys = StellarSys()
root.mainloop()

您将 self.bodies 初始化为 None,然后尝试下标该值。如错误所述,您不能对 None.

的值使用下标

您需要修改逻辑,使 self.bodies 成为非空列表,然后再尝试引用列表中的项目。