@reinerdoll: Man schreibt die Schleife nicht selbst. Und bei Tk kann es auch Probleme geben wenn man selbst `update()` verwendet. Lass es einfach und mach es gleich richtig bevor es Probleme gibt, die Du *dann* nicht lösen kannst ohne die reguläre Hauptschleife zu verwenden.
Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` Unmengen an Namen ins Modul die nicht gebraucht werden, es besteht die Gefahr von Namenskollisionen, und man importiert auch Sachen die gar nicht in dem Modul definiert, sondern seinerseits dort importiert werden.
Nummerierte Namen sind in aller Regel ein Zeichen das man sich entweder vernüngtige Namen ausdenken möchte, oder eine Datenstruktur statt einzelner Werte verwenden möchte. Oft ist das eine Liste.
Bei `bild2` sollte man sich für das Hauptfenster einen besseren Namen ausdenken, damit das eigentliche Bild nicht anders benannt werden muss. Man kann auch den konventionellen Namen `root` für das Hauptfenster verwenden.
Abkürzungen sollte man auch nicht verwenden. Wofür sollen `b1` und `b2` stehen? Oder anders gefragt: Warum bindest Du jeweils den Wert `None` an diese beiden Namen? Das ist nämlich der Rückgabewert der `grid()`-Methode.
Die 1 beim den `stop*`-Namen ist einfach nur sinnfrei.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Funktionen und Methoden sollten alles was sie ausser Konstanten benötigen als Argumente übergeben bekommen. Daraus folgt das man mindestens `functools.partial()` braucht, besser aber wie von Sirius3 schon erwähnt objektorientierte Programmierung (OOP).
Code: Alles auswählen
#!/usr/bin/env python3
from functools import partial
import tkinter as tk
def on_stop_zu(canvas, stop_kolben, stop_position_var):
canvas.move(stop_kolben, 0, 20)
stop_position_var.set(153)
def on_stop_auf(canvas, stop_kolben, stop_position_var):
canvas.move(stop_kolben, 0, -20)
stop_position_var.set(1000)
def do_animation_step(canvas, kreis, kreis_position_var, stop_position_var):
if kreis_position_var.get() < stop_position_var.get():
canvas.move(kreis, 1, 0)
kreis_position_var.set(kreis_position_var.get() + 1)
canvas.after(
50,
do_animation_step,
canvas,
kreis,
kreis_position_var,
stop_position_var,
)
def main():
root = tk.Tk()
canvas = tk.Canvas(root, width=700, height=300)
canvas.grid(row=0, column=0)
canvas.create_rectangle(150, 80, 160, 100, fill="grey")
stop_kolben = canvas.create_rectangle(153, 80, 157, 100, fill="grey")
stop_position_var = tk.IntVar(value=1000)
kreis = canvas.create_oval(50, 100, 70, 120, fill="blue")
kreis_position_var = tk.IntVar(value=70)
canvas.create_line(50, 100, 600, 100)
canvas.create_line(50, 120, 600, 120)
tk.Button(
root,
text="Stop zu",
command=partial(on_stop_zu, canvas, stop_kolben, stop_position_var),
).grid(row=1, column=0)
tk.Button(
root,
text="Stop auf",
command=partial(on_stop_auf, canvas, stop_kolben, stop_position_var),
).grid(row=2, column=0)
tk.Label(root, textvariable=kreis_position_var).grid(row=3, column=0)
tk.Label(root, textvariable=stop_position_var).grid(row=4, column=0)
do_animation_step(canvas, kreis, kreis_position_var, stop_position_var)
root.mainloop()
if __name__ == "__main__":
main()