Seite 2 von 3

Verfasst: Montag 8. Oktober 2007, 16:19
von klaus
"I" ist die Klasse. Ich hab sie zuerst Iface genannt, da ich aber so viele Variablen habe, die an sie gebunden sind, habe ich den Namen abgekürzt.

edit: wieso kann ich eig. ältere Beiträge nicht mehr löschen?

Verfasst: Montag 8. Oktober 2007, 17:07
von schlangenbeschwörer
1. Check- und Radiobuttons und alle anderen TkWidgets die Variablen erwarten, erwarten tk-Variablen, also tk.StringVar, tk.IntVar, ...
In deinem Fall tk.StringVar.
2. wieso ist das ne klassenvariable?
3. -> machs über self!
4. kommt bestimmt gleich von jmd. anderem

@edit: ua. weil dann der Rest keinen sinn mehr ergibt.

Verfasst: Montag 8. Oktober 2007, 17:08
von Leonidas
klaus hat geschrieben:edit: wieso kann ich eig. ältere Beiträge nicht mehr löschen?
Du kannst sie löschen, solange noch niemand drauf geantwortet hat. Wenn jemand drauf antwortet, zum Beispiel auf deinen Text bezug nimmt und du den Post dann löscht, dann steht der Antwortende doch ziemlich blöd da, wenn er auf etwas antwortet, was von dir gelöscht wurde und daher nicht mehr lesbar ist.

Verfasst: Montag 8. Oktober 2007, 17:09
von BlackJack
Dann solltest Du nicht so viele Namen daran binden, bzw. an die *Klasse* sowieso nicht. Da es zwei Fenster sind, könnte man das Ganze auch auf eine Klasse/Objekt pro Fenster aufteilen.

Zum eigentlichen Problem: Soweit ich weiss müssen die Argumente für `variable` vom Typ `Tkinter.StringVar`, `Tkinter.IntVar`, `Tkinter.DoubleVar` oder `Tkinter.BooleanVar` sein.

Verfasst: Montag 8. Oktober 2007, 17:45
von klaus
Ok, dann mach ich zwei Klassen.

Ich hab die Beiden Variablen in tk.topic und tk.modus umbenannt und es klappt trotzdem nicht. Wie müssen die Variablen genau heißen und wie kann ich dann später auf sie zugreifen.
(Tkinter mit "as tk" importiert)

Verfasst: Montag 8. Oktober 2007, 18:22
von schlangenbeschwörer
:x Du musst nicht die Namen ändern sondern ihnen tk-Variablen zuweisen:

Code: Alles auswählen

variablenname = tk.StringVar()
tk.Checkbutton(variable = variablenname)

Verfasst: Dienstag 9. Oktober 2007, 00:23
von poker
@klaus: Nimm es mir nicht übel, aber lies dir mal bitte ein Tutorial durch und nicht nur das: Arbeite es auch von A-Z durch, damit du ein Verständnis für GUI Entwicklung bekommst! Das was ich bisher von dir hier sehe, lässt mich halt darauf schließen das dir das Allgemeine Verständnis fehlt.

Verfasst: Dienstag 9. Oktober 2007, 13:14
von klaus
Das ist mein erstes Tkinter-Projekt und ich habe mich davor noch nicht damit auseinandergesetz. Ich habe Tkinter für dieses Projekt extra "gelernt" und bin deshalb kein Profi.

Allerdings muss ich hier eins sagen: Wenn ich Probleme mit Tkinter hatte, habe ich immer zuerst im Internet gesucht, und meistens auf der Seite effbot.org geschaut. Da steht zwar v = IntVar(), aber nicht warum, und dass man das machen muss. Da ich jetzt weiß, wie man das machen muss, isses natürlich klar, aber wenn man als Neuling auf die Seite kommt, dann ist das halt sehr unauffällig. Da steht (in Textform) nur, dass der Wert von variable die Zugehörigkeit zu einer Buttongruppe signalisiert, aber nicht, dass dieser erst speziell erzeugt werden muss.

Außerdem: welche Dokumentation soll ich denn durcharbeiten. Die von effbot scheint mir nicht soviel Wert auf z.T. wichtige Einzelheiten zu legen, sondern eher einen groben Überblick über Tkinter zu geben.

@schlangenbeschwörer: Danke für den Tipp.

Verfasst: Dienstag 9. Oktober 2007, 14:32
von schlangenbeschwörer
klaus hat geschrieben:Außerdem: welche Dokumentation soll ich denn durcharbeiten. Die von effbot scheint mir nicht soviel Wert auf z.T. wichtige Einzelheiten zu legen, sondern eher einen groben Überblick über Tkinter zu geben.
Hast du danach auch mal gesucht? ZB hier in der Forensuche?
als Suchwort eignet sich sowas wie "Tkinter lernen" :wink:

Verfasst: Dienstag 9. Oktober 2007, 23:58
von poker
Klaus: Wie gesagt der Post ist nicht böse gemeint, aber IMO würde ich halt erstmal die Tuts durcharbeiten und mich dann auf ein kleines Projekt stürzten. GUIs zu schreiben ist nicht gerade ein triviales Thema und kann auch schon bei recht kleinen Projekten ziemlich komplex werden.

IMO finde ich die Infos von hier http://wiki.python.org/moin/TkInter recht gut. Sind viele nützliche Links verlinkt die einem ein guten einstieg bieten und natürlich google mit "tkinter tutorials" füttern.

Verfasst: Samstag 20. Oktober 2007, 14:16
von klaus
Hi Leute, ich hab mal wieder ein Problem, und zwar, warum die Funktion collect in der Klasse Lib nicht die beiden Funktionsaufrufe durchführt, die in den letzten Zeile stehen. Ich habs auch schon mit Kleinschreibung probiert, aber es geht nicht.
Hier mal der Code:

Code: Alles auswählen

##importe
class Iface:
    question, solve, stat = "default", "default", "default"
    points, counter, loop, switch = 0, 0, 0, 2
    modus, m, dur = "abf", "", 0
    index = [["Latein Vokabeltrainer", "", 0]]
    def __init__(self, master):
## Erzeugung des Hauptfensters

    def turn(self):
        print "turn"
        if self.modus == "lrn":
            for vokabel in range(0, len(self.index)):
                if vokabel[2] > 3:
                    self.index.pop(vokabel)
                    reduced += 1
    	if self.modus in ["abf", "lrn"]:
            self.dur = len(self.index)
            print self.dur
        self.loop = 0
    
    def correct(self, event):
## ...

    def next(self, access = -1):
        if self.switch != 0:
            pass
        else:
            print "next"
            if self.loop < self.dur:
                if self.modus == "wdh":
                    access = randrange(0, len(self.index))
                else:
                    access = self.loop
            elif self.modus in ["abf", "wdh"]:
                self.evaluate(self.points, self.counter)
            else:
                self.turn
            if access > -1:
                self.question, self.solve, self.stat = self.index[access]
                self.label.config(text=self.question)
                self.entry.delete(0, tk.END)
                self.button.config(text="-------")
                self.switch = 1
                self.loop += 1

    def evaluate(self, err, von):
## ...

class Lib:
    voklist = []
    topic, t = "rom", ""
    von, bis = 0, 0
    def __init__(self):
## Erzeugung des Auswahlfensters

    def collect(self):
        topic, start, ende = self.topic, self.von, self.bis
## Erzeugung von self.voklist
        Iface.index = self.voklist
        Iface.switch = 0
        iface.button.config(text="Start")
        Iface.next
        Iface.turn
	
root = tk.Tk()
iface = Iface(root)
library = Lib()
root.mainloop()
Wäre nett, wenn mir jemand helfen könnte.

@poker: auch in dieser Dokumentation steht nicht explizit drin, dass man den Variablennamen erst erzeugen muss.

Verfasst: Samstag 20. Oktober 2007, 15:09
von schlangenbeschwörer
Das ist das Gegenteil von dem hier
:arrow: Da du die Methoden nicht verarbeiten sondern aufrufen willst, muss du das schon sagen, und zwar dadurch, das du da zwei klammern hinterpappst, wie du es in allen anderen Fällen auch getan hast :!:

Verfasst: Mittwoch 31. Oktober 2007, 13:17
von klaus
Danke.

Ich habe mal wieder ein Problem: Die reset-Funktion macht noch nicht das was sie soll. Wenn man "n" eingibt, soll sich die Anwendung schließen, bei "j" soll die gleiche Abfrage nochmal wiederholt werden, und bei "a" soll das Auswahlmenü nochmal aufgehen, die anderen Variablen aber auf die Ursprungswerte zurückgesetzt werden.

Außerdem habe ich ein Problem mit der Codierung (bei Umlauten). Pyscripter bringt immer folgende Warnung.

Code: Alles auswählen

C:\Py4Kids\mylib\iface3.py:47: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  if answer in self.solve.split(", "):
Weil der Code mitlerweile etwas länger ist (200 Zeilen), hab ich ihn ausgelagert: http://paste.pocoo.org/show/8411/