Seite 1 von 1

Kommunikation zwischen verschachtelten Frames

Verfasst: Freitag 28. Dezember 2007, 23:01
von Nikolas
Hallo

Ich baue mir gerade ein MineSweeper um ein bischen Python zu lernen.

Für die Darstellung der Button habe ich mir eine Klasse geschrieben:

Code: Alles auswählen

import Tkinter as tk
import tkFont


class MineFrame(tk.Frame):

    def __init__(self,master):
        self.master = master
        self.x = -1
        self.y = -1
        tk.Frame.__init__(self)
        self.grid()
        self.setDimensions(3,4)  # HACK
        
    # setzt die Anzahl der Buttons neu und erstellt sie
    def setDimensions(self,x,y):
        self.x = x
        self.y = y
        self.createWidgets()# hier werden die Buttons in einer Liste angelegt 
Das lege ich dann in meine eigentliche Anwendung:

Code: Alles auswählen

import MineGUI
import Tkinter as tk

class FooApp(tk.Frame):
    def __init__(self):
        self.x = -1
        self.y = -1
        tk.Frame.__init__(self)
        self.grid()
        self.button = tk.Button(self,text="fooBar")
        self.button.grid()
        self.frame = MineGUI.MineFrame(self)
        self.frame.grid()

    def foo(self,x,y):
        print x
        # hier steht dann die eigentlich Logik des Spiels ...

app = FooApp()
app.mainloop()
Jetzt muss ich den Button im inneren (Mine-) Frame sagen, dass sie doch bitte ein Nachricht an die äussere Klasse schicken. Bis jetzt habe ich bei der Erstellung der Buttons einen lambda-Ausdruck stehen, in dem ich Identifikation der Buttons habe, jetzt muss ich diese Information nur eine Klasse höher bekommen.
Könnte mir da vielleicht jemand weiterhelfen?

Nikolas

Verfasst: Freitag 28. Dezember 2007, 23:57
von BlackJack
Du müsstest den Frame so schreiben, dass Du ihm eine Methode als Wert mitgibst, die aufgerufen werden soll, wenn ein Feld angeklickt wird und dort dann die `foo()`-Methode übergeben.

Auch hier fehlt wieder das `Tkinter.Tk()`-Objekt als Hauptfenster. Beim Aufruf des Konstruktors der Basisklasse muss man `master` auch übergeben. Und im Konstruktor von Widgets sollte man keine Layout-Methoden für das Objekt selbst aufrufen. Kann ja sein, das derjenige, der eine Instanz von dem Widget erstellt da etwas anderes machen möchte. Bei `grid()` sollte man auch die Koordinaten von der Zelle angeben. Weiss gar nicht was ohne gemacht wird.

Verfasst: Samstag 29. Dezember 2007, 11:23
von schlangenbeschwörer
Sonst gehts auch, dann wirds immer unten drangehängt, ähnlich wie bei .pack(). Das Problem ist, die Position (col/row) wird nicht festgelegt, dh. wenn man was "grid_remove()"t und dann wieder griddet, wirds wieder ganz unten drangehängt.
Und auch hier sind "Tk()" und "master" kein Muss sondern ein Soll.

Verfasst: Samstag 29. Dezember 2007, 12:37
von Nikolas
Ich habe jetzt im anderen Thread eine hoffentlich bessere Version nach euren Vorschlägen geschrieben.