Seite 1 von 2
>tkinter< problem...
Verfasst: Mittwoch 11. August 2004, 17:12
von lionking16
moin,
hab mich vergessen einzuloggen... naja ich bin jedenfalls lionking
bei
dem programm, möchte ich, dass:
1. durch drücken der Taste >Enter< der button "ok" betätigt wird.
2. dass der cursor beim start des programms gleich in das erste eingabefeld springt und man ohne vorher mit der maus draufzuclicken eingaben tätigen kann.
so das erstmal, wie mache ich das? hab noch nix darüber gefunden...
und habt ihr sonst noch verbesserungsvorschläge?
danke schonmal!
achja, ich kann das programm nicht durch doppelclick auf das symbol ausführen, es kommt die cmd aber nicht die gui... nur wenn ich in idle bin funzt es mit F5....[/url]
Verfasst: Mittwoch 11. August 2004, 18:05
von mawe
Hi!
Also zu 2. verwende folgendes:
lionking16 hat geschrieben:
achja, ich kann das programm nicht durch doppelclick auf das symbol ausführen, es kommt die cmd aber nicht die gui... nur wenn ich in idle bin funzt es mit F5....
Schreib statt
app.mainloop einfach
root.mainloop(), dann funktionierts
Gruß, mawe
Verfasst: Mittwoch 11. August 2004, 18:24
von mawe
Hi nochmal!
lionking16 hat geschrieben:
1. durch drücken der Taste >Enter< der button "ok" betätigt wird.
Code: Alles auswählen
ok=Tkinter.Button(artnum, text="Ok", command = lambda: self.onok(self.artnr.get()))
root.bind('<Return>',lambda x:self.onok(self.artnr.get()))
Gruß, mawe
Verfasst: Mittwoch 11. August 2004, 18:37
von lionking
vielen dank schonmal
aber wo setze ich das "self.artentry.focus()" hin?
Verfasst: Mittwoch 11. August 2004, 18:47
von mawe
lionking16 hat geschrieben:
aber wo setze ich das "self.artentry.focus()" hin?
Irgendwo in
__init__(). Auf jeden Fall unter
Code: Alles auswählen
self.artentry=Tkinter.Entry(artnum, textvariable = self.artnr)
Gruß, mawe
Verfasst: Mittwoch 11. August 2004, 19:11
von lionking
ok danke
Verfasst: Samstag 14. August 2004, 17:07
von lionking
Schreib statt app.mainloop einfach root.mainloop(), dann funktionierts
hat leider nich funktioniert
noch n vorschlag?
Verfasst: Samstag 14. August 2004, 19:12
von mawe
Hi!
lionking hat geschrieben:
hat leider nich funktioniert
Hast Du vielleicht die
() vergessen? So sollte es aussehen:
Code: Alles auswählen
def main():
root = Tkinter.Tk()
app = Kasse(root)
app.pack()
root.mainloop()
Bei mir funktioniert das
Gruß, mawe
Verfasst: Samstag 14. August 2004, 20:29
von lionking
jupp jezz gehts, ich hatte die klammern vergessen
Danke
Verfasst: Samstag 21. August 2004, 15:14
von lionking
so nochwas:
ich möchte, das die artikelliste aus einer datei eingelesen wird und so dass ich sie weiterverwenden kann als liste in der variable self.art gespeichert wird, dazu muss ich den string aus der textdatei aber in die liste umwandel, wie mache ich das?
so funzt es nich:
wie dann?
Verfasst: Samstag 21. August 2004, 16:01
von Milan
Hi. Ist doch alles in Ordnung oder? Ich seh jedenfalls keine Fehlermeldung

... readlines liefert übrigens schon eine Liste der Zeilen, allerdings ist da immer noch der Zeilenumsprung dran.
Verfasst: Samstag 21. August 2004, 16:54
von lionking
ja klar ne fehlermeldung kommt nich, aber ich kann mit der liste nich so weiterarbeiten wie im oberen beispiel...
Verfasst: Samstag 21. August 2004, 17:32
von Milan
HI. Das ist ja auch logisch, schließlich stehen die Daten alle als Strings in der Datei. Wie sie da genau drin stehen hab ich keine Ahnung, da wär eine Information mehr nicht schlecht... *aus der Nase zieh*

da gibts halt zif Möglichkeiten, wie man das machen kann. Hier mal ein Beispiel mit csv:
Code: Alles auswählen
import csv
def writelist(filename,datalist):
f=file(filename,"w")
writer=csv.writer(f)
writer.writerows(datalist)
f.close()
def readlist(filename):
f=file(filename,"r")
reader=csv.reader(f)
erg=list(reader)
#alle Einträge sind Strings !!! Die müssen noch konvertiert werden
#falls die Liste aus deinem Beispiel genommen wird, geht das hier, ansonsten bastel dir was
for row in erg:
for i in xrange(0,len(row),1):
try:
row[i]=float(row[i])
except ValueError:
pass
return erg
mfg Milan
EDIT: Verbesserungen in Umwandlung, Dank an mawe

Verfasst: Samstag 21. August 2004, 18:26
von lionking
wie die daten drin stehen is mir egal, sie müssen per texteditor editierbar sein und vorher aus der liste gespeichert werden...
also ich wollte das so machen, dass wenn das programm beendet wird, die daten auch der liste abgespeichert werden und wenn das programm wieder gestartet wird werden sie wieder eingelesen und verarbeitet und am ende wieder abgespeichert in die selbe datei(überschrieben) usw...
Verfasst: Samstag 21. August 2004, 19:40
von Dookie
Hi lionking,
wie ist denn die Artikelliste aufgebaut, als Liste von Dictionaries?
Du könntest sie auch mittels
PyXO als xml-Datei speichern, wenn es sich um Builtintypen in der Liste handelt.
Code: Alles auswählen
import PyXO
Artrikeldatei = "Artikelliste.xml"
...
def speichere_artikel(self):
PyXO.Object.save(Artikeldatei, self.art)
def lade_artikel(self):
self.art = PyXO.Object.load(Artikeldatei)
...
Hat den Vorteil, daß es eine xml-Datei erzeugt, die leicht zu editieren ist.
Ansonst müsstes Du schon ein bisschen verraten wie und welche Artikeldaten in der Liste abgelegt sind.
Gruß
Dookie
Verfasst: Samstag 21. August 2004, 19:58
von mawe
Hi lionking!
Milan und Dookie haben Dir ja schon sehr gute Tipps (mit "pp" - schrecklich

) gegeben. Wenn Du es ganz einfach haben willst, könntest Du es so versuchen:
Artikeldatei (artdat.dat):
Code: Alles auswählen
Name Nummer Preis Pfand Verkaufte_heute Lagerbestand Ladenbestand
Cola 1.0 0.5 0.25 0.0 0.0 0.0
Kekse 2.0 1.0 0.0 0.0 0.0 0.0
Broetchen 3.0 0.75 0.0 0.0 0.0 0.0
Pfand 0.0 -0.25 0.0 0.0 0.0 0.0
Code: Alles auswählen
# einlesen
f = file("artdat.dat","r")
self.art = [x.split() for x in f.readlines()]
for i in xrange(0,len(self.art),1):
for j in xrange(0,len(self.art[i]),1):
try:
self.art[i][j] = float(self.art[i][j])
except: pass
# schreiben
f = file("artdat.dat","w")
for i in xrange(0,len(self.art),1):
for j in xrange(0,len(self.art[i]),1):
f.write("%s " % str(self.art[i][j]))
f.write("\n")
Gruß, mawe
Verfasst: Samstag 21. August 2004, 20:09
von Milan
Hi. Das einlesen sollte wenn so aussehen, sonst gibts ne leere Liste

(wegen des x.split()
[0])
Code: Alles auswählen
# einlesen
f = file("artdat.dat","r")
self.art = [x.split()[0] for x in f]
for i in self.art:
for j in xrange(0,len(i),1):
try:
i[j] = float(i[j])
except: pass
Ansonsten seh ich da keine Probleme, jetzt gibts 3 Möglichkeiten und das einbauen musst du schon selber machen. Am Anfang einmal einlesen und bei Bedarf speichern (nur ausführen davon) sollte dir ein leichtes sein. Alle drei sind auch im editor leicht zu bearbeiten, wobei ich allerdings CSV vorziehen würde

Ist auch mit excel zu bearbeiten und macht nicht soviel zusätzlichen Speicherplatz weg wie XML...
Verfasst: Samstag 21. August 2004, 20:17
von lionking
so ist die liste aufgebaut:
Code: Alles auswählen
self.art=[
['Name','nummer','preis','pfand','verkauftheute','lagerbestand','ladenbestand'],
['Cola', 1, 0.5, 0.25, 0, 0, 0],
['Kekse', 2, 1.00, 0, 0,0,0],
['Broetchen', 3, 0.75, 0, 0,0,0],
['pfand',0,-0.25,0,0,0,0],
]
Verfasst: Samstag 21. August 2004, 20:20
von mawe
Hi!
@Milan:
Versteh nicht was Du meinst. Hast Du Deine Methode ausprobiert? Ich bekomm dann als self.art folgendes:
Ist glaub ich nicht das Gewünschte
Gruß, mawe
Verfasst: Samstag 21. August 2004, 20:33
von Milan
Hi, hast recht... Ich hatte gerade was anderes gedacht, nämlich dass nur der Zeilenumsprung weggemacht werden müsste... Ist schon ok.