【问题标题】:Can't write animation code in separate function, tkinter无法在单独的函数中编写动画代码,tkinter
【发布时间】:2019-12-11 01:10:01
【问题描述】:

我有以下代码,其中我创建了一个类 Display 的许多实例,然后在每个类中我调用函数 display,它显示数据

from tkinter import *

class Display:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def display(self):
        canvas.create_oval(self.x,self.y,self.x+10,self.y+10,fill="lime")

def show(inst):    
    makeFun = Tk()
    canvas = Canvas(makeFun, width=800, height=700)
    makeFun.title("Test Evolution")
    canvas.pack()

    instance = [Display(random.randrange(300,700),random.randrange(300,700)) for a in range(inst)]

    for a in range(inst):
        instance[a].display()

    canvas.mainloop()

但是当我调用函数时...

show(10)

它返回一个错误说:

NameError: name 'canvas' is not defined

【问题讨论】:

  • 函数中创建的变量是local,你不能在其他函数中访问它。在课堂上你应该使用self.canvas,但首先你应该将画布发送到课堂 - __init__(self, canvas, x, y)__: self.canvas = canvas。或使用def display(self, canvas):
  • BT:W 而不是 for a in range(inst): instance[a].dosplay() 你应该使用 for item in instance: item.display() - 它在 Python 中更受欢迎,因为它更具可读性。

标签: python function class animation tkinter


【解决方案1】:

函数中创建的变量是local,你不能在其他函数中访问它,所以你应该把它作为参数发送

def display(self, canvas):

item.display(canvas)

顺便说一句:名称Item 更适合此类,因为它是您将显示的项目/对象。

您可以使用首选方法来处理列表 - 没有 range()

    for item in instances:
        item.display(canvas)

完整的工作示例

import tkinter as tk # `import *` is not preferred
import random

class Item:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def display(self, canvas):
        canvas.create_oval(self.x, self.y, self.x+10, self.y+10, fill="lime")

def show(inst):    
    root = tk.Tk()
    root.title("Test Evolution")

    canvas = tk.Canvas(root, width=800, height=700)
    canvas.pack()

    instances = [Item(random.randrange(300,700),random.randrange(300,700)) for a in range(inst)]

    for item in instances:
        item.display(canvas)

    root.mainloop()

show(100)    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多