Python tkinter在def中移动已在另一个def中创建的对象

Python tkinter在def中移动已在另一个def中创建的对象,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在制作一款飞鸟风格的游戏。我的问题是我不能移动在另一个def上创建的管。 我的代码是 from tkinter import * from random import randint window = Tk() c = Canvas(window, width=800, height=800, bg='steelblue') tube11 = randint(600, 650) tube12 = randint(400, 700) def createtubes(): tube1 =

我正在制作一款飞鸟风格的游戏。我的问题是我不能移动在另一个def上创建的管。 我的代码是

from tkinter import *
from random import randint
window = Tk()
c = Canvas(window, width=800, height=800, bg='steelblue')
tube11 = randint(600, 650)
tube12 = randint(400, 700)
def createtubes():
    tube1 = c.create_rectangle(800, 800, tube11, tube12, fill='green')
    tube2 = c.create_rectangle(800, 0, tube11, 200, fill='green')   
def automovement():
    if True:
        c.move(tube1, -3.5, 0)
        c.move(tube2, -3.5, 0)
    window.update_idletasks()
    window.after(10, automovement)
window.after(60, createtubes)
window.after(10, automovement)
c.pack()
window.mainloop()
尝试创建一个类

from tkinter import *
from random import randint
window = Tk()
c = Canvas(window, width=800, height=800, bg='steelblue')
tube11 = randint(600, 650)
tube12 = randint(400, 700)
class Tubes:
    def __init__(self):
        self.createtubes()
    def createtubes(self):
        self.tube1 = c.create_rectangle(800, 800, tube11, tube12, fill='green')
        self.tube2 = c.create_rectangle(800, 0, tube11, 200, fill='green')   
    def automovement(self):
        if True:
            c.move(self.tube1, -3.5, 0)
            c.move(self.tube2, -3.5, 0)
        window.update_idletasks()
        window.after(10, self.automovement)
tube = Tubes()
window.after(10, tube.automovement)
c.pack()
window.mainloop()
尝试创建一个类

from tkinter import *
from random import randint
window = Tk()
c = Canvas(window, width=800, height=800, bg='steelblue')
tube11 = randint(600, 650)
tube12 = randint(400, 700)
class Tubes:
    def __init__(self):
        self.createtubes()
    def createtubes(self):
        self.tube1 = c.create_rectangle(800, 800, tube11, tube12, fill='green')
        self.tube2 = c.create_rectangle(800, 0, tube11, 200, fill='green')   
    def automovement(self):
        if True:
            c.move(self.tube1, -3.5, 0)
            c.move(self.tube2, -3.5, 0)
        window.update_idletasks()
        window.after(10, self.automovement)
tube = Tubes()
window.after(10, tube.automovement)
c.pack()
window.mainloop()

也可以在矩形上使用标记选项

tube1 = c.create_rectangle(800, 800, tube11, tube12, fill='green', tags='tube')
tube2 = c.create_rectangle(800, 0, tube11, 200, fill='green', tags='tube')
在你的功能中只有一个动作:

c.move('tube', -3.5, 0)

也可以在矩形上使用标记选项

tube1 = c.create_rectangle(800, 800, tube11, tube12, fill='green', tags='tube')
tube2 = c.create_rectangle(800, 0, tube11, 200, fill='green', tags='tube')
在你的功能中只有一个动作:

c.move('tube', -3.5, 0)

只需让createtubes函数返回它创建的对象。然后将它们传递给需要移动它们的函数。如果你的函数在很大程度上操作它们的输入并返回它们的输出,那么你通常会有一个更轻松的编程时间。或者你可以创建一个类并将重要变量存储为你的类函数操作的成员。只需让你的CreateTubles函数返回它创建的对象。然后将它们传递给需要移动它们的函数。一般来说,如果函数主要对其输入进行操作并返回其输出,则编程将更容易。或者,您可以创建一个类并将重要变量存储为类函数操作的成员。现在它不会打印任何错误,只是管不会移动。您使用了哪一个?如果你使用一类,你必须说
tubes=tubes()
window.after(10,tubes.autoMovement)
我使用了一类,但我仍然得到错误tube1没有定义我使用了一类,我得到了一个错误“tube1”没有定义。好的,我不知道为什么,但当我复制代码时它工作了。在此之前,我从浏览器中编写了那个东西,但它不起作用。我不知道为什么。现在它不打印任何错误管只是管不动。你用的是哪一个?如果你使用一类,你必须说
tubes=tubes()
window.after(10,tubes.autoMovement)
我使用了一类,但我仍然得到错误tube1没有定义我使用了一类,我得到了一个错误“tube1”没有定义。好的,我不知道为什么,但当我复制代码时它工作了。在此之前,我从浏览器中编写了那个东西,但它不起作用。我不知道为什么。