Ach so, Du wolltest die Klasse aus einem anderen Skript importieren.
Dann würde ich das z.B. eher so schreiben:
Code: Alles auswählen
#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-
import Tkinter as tk
class RectangleMover(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.count = 0
self.createWidgets()
self.pack()
def createWidgets(self):
self.cv = tk.Canvas(self, width="500", height="50")
self.cv.create_rectangle(0, 0, 10, 10, tags="thing", fill="black")
self.cv.pack(side = tk.LEFT)
def moveThing(self):
self.count += 1
self.checkCount()
self.cv.move("thing", 1, 0)
self.cv.after(500, self.moveThing)
def checkCount(self):
if self.count >= 22:
print 'sperren'
self.count = 0
class MainWindow:
def __init__(self):
self.mw = tk.Tk()
self.rm = RectangleMover(self.mw)
self.rm.moveThing()
self.mw.mainloop()
if __name__ == "__main__":
app = MainWindow()
Anmerkungen:
- Man unterscheidet einfache Variablen wie "a", die nur innerhalb einer Funktion bekannt sind, und Klassenvariablen wie "self.a", die auch in anderen Funktionen (Methoden) derselben Klasse bekannt sind. Dadurch braucht man kein "global".
- Die Funktion "__init__()" wird automatisch ausgeführt, sobald ein Objekt der Klasse instantiiert wird (hier: "self.rm = RectangleMover(self.mw)")
- Man sollte keine Namen für Klassen oder Variablen verwenden, die mit anderen Namen verwechselt werden können: "init" kann man z.B. mit "__init__()" verwechseln, "draw" wird auch oft verwendet (wenn auch nicht in Tkinter.Canvas), "def count():" kann man mit der Variablen "count" oder "self.count" verwechseln ...
Ach ich sehe gerade, wenn ich keine grafische Ausgabe in der Klasse haben möchte, das das interval after ja über TK läuft. Gibt es ähnliches von Pyhton? Eine Timerklasse die alle 200 Milisekunden taktet? Oder rufe ich mit after aus den Programm die Mehtode der Klasse auf?
Ohne GUI/Tkinter könnte so etwas z.B. so aussehen:
Code: Alles auswählen
#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-
import time
class Counter:
def __init__(self):
self.count = 0
def increaseCounter(self):
self.count += 1
print self.count
self.checkCount()
time.sleep(0.2)
self.increaseCounter()
def checkCount(self):
if self.count >= 22:
print 'sperren'
self.count = 0
class MainWindow:
def __init__(self):
self.counter = Counter()
self.counter.increaseCounter()
if __name__ == "__main__":
app = MainWindow()
"time.sleep()" stoppt aber die gesamte Anwendung. Wenn Du eine Konsolenanwendung bauen möchtest, die mehrere Sachen nebeneinander macht, wirst Du wahrscheinlich "Threads" verwenden müssen ("pydoc thread", "pydoc threading"). Ich vermeide sowas aber, weil ich's selten stabil hinkriege. Ein einzelner einfacher Thread könnte aber vielleicht klappen ...
Gruß