Kommunikation zwischen verschachtelten Frames

Fragen zu Tkinter.
Antworten
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

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
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
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.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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.
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

Ich habe jetzt im anderen Thread eine hoffentlich bessere Version nach euren Vorschlägen geschrieben.
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
Antworten