Seite 1 von 1

Darstellungsprobleme mit Dialog

Verfasst: Donnerstag 4. September 2008, 08:52
von Flo668
Ich habe eine Klasse erstellt, die für das Darstellen eines Dialoges verwendet werden soll. Im Folgenden steht die __init__:

Code: Alles auswählen

 def __init__(self):
        dlgMain = Tk()
        self.label = Label(dlgMain, text = 'RED Workflow')
        self.label.pack()

        ####

        l1 = 'Ablageort der XML Datei: '
        l2 = 'Anderer Text: '

        ###

        label1 = Label(dlgMain, text = l1, justify = LEFT)
        label2 = Label(dlgMain, text = l2, justify = LEFT)

        label1.pack()
        label2.pack()

        ###

        self.entryPath = Entry(dlgMain, width = 30)
        self.entryAux = Entry(dlgMain, width = 30)

        self.entryPath.pack()
        self.entryAux.pack()

        ###
        self.buttonPfad = Button(dlgMain, text = 'XML File', command = self.PfadClick())
        self.buttonOK = Button(dlgMain, text = 'OK', command = self.OkClick())
        self.buttonCancel = Button(dlgMain, text = 'Abbrechen', command = self.CancelClick())

        self.buttonPfad.pack()
        self.buttonOK.pack()
        self.buttonCancel.pack()

        ###

        dlgMain.mainloop()

def self.PfadClick()

# usf
merkwürdig ist nun:

- keines der Buttons wird dargestellt

- Es wird sofort "self.PfadClick()" ausgeführt, nur ohne dass da jemand den Button gedrueckt hat (wie auch, wenn er nicht dargestellt wird)

Was habe ich hier falsch gemacht?

Verfasst: Donnerstag 4. September 2008, 09:19
von BlackJack
Kann es sein, dass Du vorher schon ein `Tk`-Exemplar erstellt hast? Pro Anwendung darf davon nur *eines* existieren. Zusätzliche Fenster werden mit `Toplevel`-Exemplaren erstellt.

Oder Du machst in `PfadClicked()`, `OkClick()`, oder `CancelClick()` vielleicht irgend etwas was die Anzeigen verhindert weil die Zeilen 33 bis 35 nicht erreicht werden.

Womit wir bei dem Aufruf währen: Das `PfadClicked` wird aufgerufen, weil Du es aufrufst. Wenn Du das nicht möchtest, dann ruf es halt nicht auf. Wenn im Quelltext steht ``a = f()`` bedeutet das, rufe `f` auf und binde das Ergebnis an den Namen `a`. Warum `PfadClick()` aufgerufen wird ist also überhaupt nicht merkwürdig sondern ganz normal. Wenn Du eine Funktion an einen Namen binden willst, dann musst Du den Aufruf weglassen: ``a = f``.

PS: Ich habe den Verdacht, dass Du einen *-Import verwendest. Die sind Böse™.

Verfasst: Donnerstag 4. September 2008, 10:17
von Flo668
Erstmal vielen Dank.

In der Tat verwende ich einen Import mit *

Code: Alles auswählen

from Tkinter import *
Was ist denn so böse daran?

Ein weiteres TK Exemplar gibt es nicht, aber nach dem Entfernen der Klammern aus den command = Funktion Teilen, erscheinen die Buttons auch korrekt.

Vermutlich lag die Darstellungsproblematik darin begründet, dass die Methode PfadClick() ausgeführt wurde, und dadurch dann die pack() Befehle nicht mehr beachtet worden sind.

Verfasst: Donnerstag 4. September 2008, 10:24
von Leonidas
Flo668 hat geschrieben:Erstmal vielen Dank.

In der Tat verwende ich einen Import mit *

Code: Alles auswählen

from Tkinter import *
Was ist denn so böse daran?
Siehe [wiki]Import[/wiki].

Verfasst: Donnerstag 4. September 2008, 11:40
von wuf
Hallo Flo668

Kannst du einmal das folgende ausprobieren:

Code: Alles auswählen

import Tkinter as tk

class MyDialog(object):

    def __init__(self):
        dlgMain = tk.Tk()
        self.label = tk.Label(dlgMain, text = 'RED Workflow')
        self.label.pack()

        ####

        l1 = 'Ablageort der XML Datei: '
        l2 = 'Anderer Text: '

        ###

        label1 = tk.Label(dlgMain, text = l1, justify = tk.LEFT)
        label2 = tk.Label(dlgMain, text = l2, justify = tk.LEFT)

        label1.pack()
        label2.pack()

        ###

        self.entryPath = tk.Entry(dlgMain, width = 30)
        self.entryAux = tk.Entry(dlgMain, width = 30)

        self.entryPath.pack()
        self.entryAux.pack()

        ###
        self.buttonPfad = tk.Button(dlgMain, text = 'XML File', command = self.PfadClick)
        self.buttonOK = tk.Button(dlgMain, text = 'OK', command = self.OkClick)
        self.buttonCancel = tk.Button(dlgMain, text = 'Abbrechen', command = self.CancelClick)

        self.buttonPfad.pack()
        self.buttonOK.pack()
        self.buttonCancel.pack()

        ###

        dlgMain.mainloop()

    def PfadClick(self):
        print 'Pfad-Click'

    def OkClick(self):
        print 'OK-Click'

    def CancelClick(self):
        print 'Cancel-Click'

#~~ Erstelle die Dialog-Instanz
my_dialog_obj = MyDialog()
Gruss wuf :wink: