Warum geht isspace nicht?

Fragen zu Tkinter.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Ich hatte von einem Entry eingelesen und das sogar noch mit str in einen String verwandelt, aber isspace() funktionierte nicht.

Da musste ich das schreiben:

Code: Alles auswählen

if not len(self.dictionary[key].strip())
Weiß vielleicht jemand, warum?
BlackJack

@Alfons Mittelmeyer: Was heisst „isspace() funktionierte nicht“? Welcher Code? Was für ein Traceback? Bei welchem Wert?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

BlackJack hat geschrieben:@Alfons Mittelmeyer: Was heisst „isspace() funktionierte nicht“? Welcher Code? Was für ein Traceback? Bei welchem Wert?
Hatte ich doch beschrieben. Aber wenn Du es als Beispiel möchtest:

Code: Alles auswählen

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk


class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        # widget definitions ===================================
        self.entry = tk.Entry(self)
        self.entry.pack()

        self.entry.bind('<Return>',lambda event, me = self.entry: self.check_isspace(me))

    def check_isspace(event,me):
        print(me.get().isspace())
    

if __name__ == '__main__':
    Application().mainloop()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: dein Beispiel funktioniert so, wie es funktionieren soll. Was machst Du, was ist das Ergebnis, was erwartest Du?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Sirius3 hat geschrieben:@Alfons Mittelmeyer: dein Beispiel funktioniert so, wie es funktionieren soll. Was machst Du, was ist das Ergebnis, was erwartest Du?
Sorry, zu spät in Bett gegangen zu früh aufgewacht, Konzentrationsmangel, Hangover. Ob etwas leer ist erfahre ich ja nicht durch isspace() sondern durch not isspace()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

wohl kaum.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Sirius3 hat geschrieben:wohl kaum.
Ja stimmt, hab ich jetzt umgekehrt ausprobiert, aber da geht es auch nicht. Da muss ich wohl das komplette Beispiel bringen.

Hier habe ich mal in Zeile 20 eingefügt: print(self.dictionary[key].isspace())
Aber es kommt immer False dabei heraus.
Es funktioniert aber Zeile 21: not len(self.dictionary[key].strip())

Code: Alles auswählen

# -*- coding: utf-8 -*-
 
try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk
 
import re
 
class Input_Class:
 
    def __init__(self, save_dictionary=None, dictionary = None):
 
        self.dictionary = dictionary if dictionary else { key : '' for key in self.keys() }
        self.save_dictionary = save_dictionary
 
    def save(self):
 
        for key in self.keys():
            print(self.dictionary[key].isspace())
            if not len(self.dictionary[key].strip()):
                return False,key + ' fehlt'
 
        plz = self.dictionary['PLZ']
        if not re.match('(?:[0-9]{5})',plz):
            return False,'PLZ stimmt nicht'
 
        if self.save_dictionary:
            self.save_dictionary(**self.dictionary)
        else:
            print(self.dictionary)
            print('\nsave function missing')
        return True,''
 
    def keys(self):
        return [ 'Name',
                 'Vorname',
                 'Straße',
                 'Hausnummer',
                 'PLZ',
                 'Ort',
                 ]
 
    def __getitem__(self,key):
        return self.dictionary[key]
 
    def __setitem__(self,key,value):
        self.dictionary[key] = value
 
 
class Application(tk.Tk):
 
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        # widget definitions ===================================
        self.Eingabemaske = Eingabemaske(self)
        self.Eingabemaske.pack(fill='x')
 
        self.Eingabemaske.create_Eingabemaske(Input_Class())
       
 
class Eingabemaske(tk.LabelFrame):
 
    def __init__(self,master,**kwargs):
        tk.LabelFrame.__init__(self,master,**kwargs)
        self.config(text='Eingabemaske')
        # widget definitions ===================================
        self.content = tk.Frame(self)
        self.content.pack(fill='x')
 
    def create_Eingabemaske(self,input_object):
        keys = input_object.keys()
 
        maxlen = max(map(len, keys))
 
        self.content.destroy()
        self.content = tk.Frame(self)
        self.content.pack(fill='x')
 
        entrylist = [] # Liste mit den Eingabefeldern zum Speichern
        for key in keys:
            frame = tk.Frame(self.content)
            frame.pack(fill='x')
            label = tk.Label(frame,text = key, width = maxlen+1,anchor = 'e')
            label.pack(side = 'left')
 
            # Sonderbehandlung für spezielle Eingabefelder
            if key == 'PLZ':
                width = 5
                expand = 0
                fill = None
            elif key == 'Hausnummer':
                width = 6
                expand = 0
                fill = None
            else:
                width = 30
                expand = 1
                fill = 'x'
            # ===========================================
               
               
            entry = tk.Entry(frame,width = width)
 
            entry.key = key # das ist zum Speichern
            entrylist.append(entry) # und das auch
 
            entry.delete(0,'end')
            entry.insert(0,str(input_object[key]))
            entry.pack(side = 'left',fill = fill,expand= expand,padx = 5,pady=1)
 
        status_label = tk.Label(self.content)
        status_label.pack(side = 'left')
 
        def save_input():
            for entry in entrylist:
                input_object[entry.key] = str(entry.get())
            result,status = input_object.save()
            status_label.config(text = status,fg='blue',font = 'TkDefaultFont 10 bold')
            # positive result should be reported
 
 
        okbutton = tk.Button(self.content,text = 'OK')
        okbutton.pack(side = 'right', anchor = 'e')
        okbutton['command'] = save_input
 
if __name__ == '__main__':
    Application().mainloop()
BlackJack

@Alfons Mittelmeyer: Ich weiss nicht warum die ganzen 128 Zeilen nötig sind wenn es doch nur um `isspace()` geht. :K
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Alfons Mittelmeyer hat geschrieben:
BlackJack hat geschrieben:@Alfons Mittelmeyer: Ich weiss nicht warum die ganzen 128 Zeilen nötig sind wenn es doch nur um `isspace()` geht. :K
Naja, weil es genau bei diesen 128 Zeilen nicht funktioniert!
Könnte auch an str liegen, oder weil es in das Dictionary aufgenommen wurde.
BlackJack

@Alfons Mittelmeyer: Das funktioniert mit beliebigen anderen Zeilen auch nicht anders — `isspace()` wird von diesen Zeilen in keinster Weise beeinflusst. Auch nicht davon wo die Zeichenkette her kommt, also ob die aus einem Wörterbuch oder einer Liste oder sonst wo her kommt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

BlackJack hat geschrieben:@Alfons Mittelmeyer: Das funktioniert mit beliebigen anderen Zeilen auch nicht anders — `isspace()` wird von diesen Zeilen in keinster Weise beeinflusst. Auch nicht davon wo die Zeichenkette her kommt, also ob die aus einem Wörterbuch oder einer Liste oder sonst wo her kommt.
Un warum bringt dann hier isspace() immer False, ganz gleich ob das Entry Feld leer ist oder nicht leer, während len() in Verbindung mit strip() funktioniert?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

BlackJack hat geschrieben:@Alfons Mittelmeyer: Das funktioniert mit beliebigen anderen Zeilen auch nicht anders — `isspace()` wird von diesen Zeilen in keinster Weise beeinflusst. Auch nicht davon wo die Zeichenkette her kommt, also ob die aus einem Wörterbuch oder einer Liste oder sonst wo her kommt.
So, und was ist dann das?

Code: Alles auswählen

a = { 'test': '' }
print(a['test'].isspace())
Ach, ich habe jetzt die Doku gelesen. Es muss mindestens ein Buchstabe vorhanden sein:

Das geht dann:

Code: Alles auswählen

a = { 'test': ' ' }
print(a['test'].isspace())
Zuletzt geändert von Alfons Mittelmeyer am Dienstag 27. Juni 2017, 22:52, insgesamt 1-mal geändert.
BlackJack

@Alfons Mittelmeyer: Das ist ein für `isspace()` komplett irrelevantes Wörterbuch, denn das hat null Einfluss auf das Ergebnis:

Code: Alles auswählen

In [4]: a = { 'test': '' }

In [5]: a['test'].isspace()
Out[5]: False

In [6]: ''.isspace()
Out[6]: False
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Also gefunden, woran es liegt. Man muss schreiben:

Code: Alles auswählen

# entweder
if not a.strip():

#oder
if not a or a.isspace():
Antworten