Seite 1 von 1

Canvas Objekt bewegen?

Verfasst: Freitag 5. Juni 2009, 12:25
von krisi12345
HI!
Die Position eines Canvas kann man ganz einfach ändern in dem Man die Positions Zahlen ändert aber wie kann man dafür sorgen sich ein Objekt gleichmäßig bewegt.

Verfasst: Freitag 5. Juni 2009, 13:10
von Pascal
ich weiß nicht ob du sowas in der art meinst...

Code: Alles auswählen

import Tkinter as tk


def make_oval():
    global i, ov
    ov=c.create_oval(5+(4*i),5+(3*i),(5*i)+60,(i)+60,fill='white', outline='white')
    i+=1
    ov=c.create_oval(5+(4*i),5+(3*i),(5*i)+60,(i)+60, fill='gray70')
    if i != 27:
        win.after(500, make_oval)




win=tk.Tk()
frame = tk.Frame(win, width=500, height=400, bd=1)
frame.pack()

iframe5 = tk.Frame(frame, bd=2, relief=RAISED)
iframe5.pack(expand=1, fill=X, pady=10, padx=5)
c = tk.Canvas(iframe5, bg='white', width=340, height=100)
c.pack()
i=0
ov=c.create_oval(5+(4*i),5+(3*i),(5*i)+60,(i)+60, fill='gray70')
make_oval()
gleichmäßig bewegt.
Durchaus eine gleichmäßige bewegung, wenn auch keine geschmeidige ;)

Verfasst: Freitag 5. Juni 2009, 18:01
von krisi12345
Für welche Python Version ist dieser Code gedacht wenn überhaupt?
Den Ich hab Ihn in Python 2.6-3.0 getestet und es kamen nur Fehler! :lol:

Verfasst: Freitag 5. Juni 2009, 18:12
von kaytec
Hallo krisi12345 und Pascal !

Das Objekt nicht immer wieder neu malen, da sie bestehen bleiben und immer wieder gezeichnet werden. Über "tag="ball"" löschen und neu zeichnen.

Code: Alles auswählen

import Tkinter as tk


def make_oval(i):
    c.delete("ball")
    c.create_oval(5+(4*i),5+(3*i),(5*i)+60,(i)+60, fill='gray70', tag="ball")
    i+=1
    if i != 28:
        win.after(100, make_oval, i)


win=tk.Tk()
frame = tk.Frame(win)
frame.pack(ipady=5, ipadx=10)
c = tk.Canvas(frame, bg='white', width=340, height=100)
c.pack()
make_oval(1)
win.mainloop()
Gruß Frank

Verfasst: Freitag 5. Juni 2009, 22:25
von kaytec
Hallo !

Oder so:

Code: Alles auswählen

import Tkinter as tk

WIDTH = 800
HEIGHT = 500

class Ball(object):
    def __init__(self, root, canvas, width, height, ball_width, color, speed, 
            start_x, start_y, tag):
        self.width = width
        self.height = height
        self.canvas = canvas
        self.speed = speed
        self.direction_x = 2
        self.direction_y = 2
        self.tag = tag
        self.canvas.create_oval(start_x, start_y, start_x + ball_width, start_y 
            + ball_width, fill=color, tag=tag)
        
    def run(self):
        self.canvas.move(self.tag, self.direction_x, self.direction_y)
        position = self.canvas.coords(self.tag)
        if position[0] == 0:
            self.direction_x = 2
        if position[1] == 0:
            self.direction_y = 2
        if position[2] == self.width:
            self.direction_x = -2
        if position[3] == self.height:
            self.direction_y = -2
        self.canvas.after(self.speed, self.run)


root=tk.Tk()
canvas = tk.Canvas(root, bg='white', width=WIDTH, height=HEIGHT)
canvas.pack()
ball_1 = Ball(root, canvas, WIDTH, HEIGHT, 30, "blue", 5, 20, 300,
    "ball_1")
ball_1.run()
ball_2 = Ball(root, canvas, WIDTH, HEIGHT, 20, "red", 10, 220, 10,
    "ball_2")
ball_2.run()
root.mainloop()
Gruß Frank

Verfasst: Freitag 5. Juni 2009, 23:13
von wuf
Hallo krisi12345
krisi12345 hat geschrieben:Den Ich hab Ihn in Python 2.6-3.0 getestet und es kamen nur Fehler! Laughing
Da hast du recht in diesem Code-Stück gibt es zwei Fehler:
http://www.python-forum.de/post-137874.html#137874

Der erste in Zeile-19:
falsch:

Code: Alles auswählen

iframe5 = tk.Frame(frame, bd=2, relief=RAISED)
richtig:

Code: Alles auswählen

iframe5 = tk.Frame(frame, bd=2, relief=tk.RAISED)
Der zweite in Zeile-20:
falsch:

Code: Alles auswählen

iframe5.pack(expand=1, fill=X, pady=10, padx=5)
richtig

Code: Alles auswählen

iframe5.pack(expand=1, fill=tk.X, pady=10, padx=5)
Gruss wuf :wink:

Verfasst: Samstag 6. Juni 2009, 10:14
von Pascal
ahh danke wuf ;)

die Fehler kommen daher, dass das ganze davor mit *-import war