>tkinter< problem...

Fragen zu Tkinter.
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]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Also zu 2. verwende folgendes:

Code: Alles auswählen

self.artentry.focus()
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 :wink:

Gruß, mawe
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

vielen dank schonmal
aber wo setze ich das "self.artentry.focus()" hin?
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

ok danke
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

Schreib statt app.mainloop einfach root.mainloop(), dann funktionierts
hat leider nich funktioniert :x
noch n vorschlag?
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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 :wink:

Gruß, mawe
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

jupp jezz gehts, ich hatte die klammern vergessen :oops:

Danke
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

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:

Code: Alles auswählen

self.art=list(artfile.readlines())
wie dann?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Ist doch alles in Ordnung oder? Ich seh jedenfalls keine Fehlermeldung :wink: :? ... readlines liefert übrigens schon eine Liste der Zeilen, allerdings ist da immer noch der Zeilenumsprung dran.
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

ja klar ne fehlermeldung kommt nich, aber ich kann mit der liste nich so weiterarbeiten wie im oberen beispiel...
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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* :wink: 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 :wink:
Zuletzt geändert von Milan am Samstag 21. August 2004, 20:40, insgesamt 4-mal geändert.
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

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...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Das einlesen sollte wenn so aussehen, sonst gibts ne leere Liste :wink: (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 :wink: Ist auch mit excel zu bearbeiten und macht nicht soviel zusätzlichen Speicherplatz weg wie XML...
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

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],
               ]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

@Milan:
Versteh nicht was Du meinst. Hast Du Deine Methode ausprobiert? Ich bekomm dann als self.art folgendes:

Code: Alles auswählen

['Name', 'Cola', 'Kekse', 'Broetchen', 'Pfand']
Ist glaub ich nicht das Gewünschte :wink:

Gruß, mawe
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi, hast recht... Ich hatte gerade was anderes gedacht, nämlich dass nur der Zeilenumsprung weggemacht werden müsste... Ist schon ok.
Antworten