Darstellungsprobleme mit Dialog

Fragen zu Tkinter.
Antworten
Flo668
User
Beiträge: 39
Registriert: Mittwoch 23. Juli 2008, 10:41

Donnerstag 4. September 2008, 08:52

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?
BlackJack

Donnerstag 4. September 2008, 09:19

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™.
Flo668
User
Beiträge: 39
Registriert: Mittwoch 23. Juli 2008, 10:41

Donnerstag 4. September 2008, 10:17

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.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 4. September 2008, 10:24

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].
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Donnerstag 4. September 2008, 11:40

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:
Take it easy Mates!
Antworten