GUI in Programm integrieren

Fragen zu Tkinter.
Benutzeravatar
klaus
User
Beiträge: 88
Registriert: Samstag 23. Juni 2007, 09:33
Wohnort: Kaufbeuren
Kontaktdaten:

Montag 8. Oktober 2007, 16:19

"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?
http://klausweidinger.kl.funpic.de
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Montag 8. Oktober 2007, 17:07

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

Montag 8. Oktober 2007, 17:08

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Montag 8. Oktober 2007, 17:09

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.
Benutzeravatar
klaus
User
Beiträge: 88
Registriert: Samstag 23. Juni 2007, 09:33
Wohnort: Kaufbeuren
Kontaktdaten:

Montag 8. Oktober 2007, 17:45

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)
http://klausweidinger.kl.funpic.de
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Montag 8. Oktober 2007, 18:22

:x Du musst nicht die Namen ändern sondern ihnen tk-Variablen zuweisen:

Code: Alles auswählen

variablenname = tk.StringVar()
tk.Checkbutton(variable = variablenname)
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

Dienstag 9. Oktober 2007, 00:23

@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.
Benutzeravatar
klaus
User
Beiträge: 88
Registriert: Samstag 23. Juni 2007, 09:33
Wohnort: Kaufbeuren
Kontaktdaten:

Dienstag 9. Oktober 2007, 13:14

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.
http://klausweidinger.kl.funpic.de
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Dienstag 9. Oktober 2007, 14:32

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:
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

Dienstag 9. Oktober 2007, 23:58

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.
Benutzeravatar
klaus
User
Beiträge: 88
Registriert: Samstag 23. Juni 2007, 09:33
Wohnort: Kaufbeuren
Kontaktdaten:

Samstag 20. Oktober 2007, 14:16

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.
http://klausweidinger.kl.funpic.de
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Samstag 20. Oktober 2007, 15:09

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 :!:
Benutzeravatar
klaus
User
Beiträge: 88
Registriert: Samstag 23. Juni 2007, 09:33
Wohnort: Kaufbeuren
Kontaktdaten:

Mittwoch 31. Oktober 2007, 13:17

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/
http://klausweidinger.kl.funpic.de
Antworten