Значения содержащие цифры/пробелы в списке(Listbox) PySimpleGUI не отображаються

у меня есть такой код


# импрорт
import PySimpleGUI as sg
import pyodbc
from datetime import datetime

#настройки
connection = pyodbc.connect(("Driver={ODBC Driver 17 for SQL Server};Server=MGP5-SPG04;Database=Test1;Trusted_Connection=yes;UID=sa;PWD=111qqqAAA"))
dbCursor = connection.cursor()
sg.theme('dark grey 9')
now = datetime.now()
Datatime = datetime.now()
print(datetime.now())

#получение списка товаров
def UpdateList():
    dbCursor.execute("select Tovar from BazaMSK")
    data = dbCursor.fetchall()
    new_list = ['']
    for word in data:
        new_str = ''
        for w in word:
            if w.isalpha():
                new_str += w
        new_list.append(new_str)
    new_str = ','.join(w for w in new_list if w)
    return new_list

#интерфейс
layout = [
    [sg.Text('Введите товар'),sg.Listbox(UpdateList(), size=(8,15), key='-KTovar1-'),sg.InputText(size=(50,6),key='-KTovar2-')],
    [sg.Text('Количество товара'),sg.InputText(size=(8,3),key='-KCountTovar-')],
    [sg.Output(size=(88, 20),key="-KInputText-")],
    [sg.Submit("Сохранить"), sg.Cancel("Обновить")]
]
window = sg.Window('Поставки', layout)

event, values = window.read()
while event not in (None,"Exit"):
    event, values = window.read()
    if event == "Сохранить":
        sql = 'EXEC [dbo].[BazaMSKInsert] @Tovar=?,@Count=?,@Data=?'
        params = (values['-KTovar2-'], values['-KCountTovar-'], Datatime)
        dbCursor.execute(sql, params)
        dbCursor.commit()
        print(params)
    if event == "Обновить":
        window['-KTovar1-'].update(values=UpdateList())

Думаю что проблема в UpdateList() его можно заменить на

res = ','.join(map(lambda x: x.split("'")[1], data[::2]))
print(res)

но тут я что-то не так написал


Ответы (2 шт):

Автор решения: Womba 306

Я нашел проблему (str. isalpha() — Вернёт True, если в строке хотя бы один символ и все символы строки являются буквами, иначе — False.)

for w in word:
    if w.isalpha():

я нашел метод который проверяет на наличие специальных символов(кроме пробела)

def detect_special_characer(pass_string):
  regex= re.compile('[@_!#$%^&*()<>?/\|}{~:]')
  if(regex.search(pass_string) == None):
    res = False
  else:
    res = True
  return(res)

и сделал

#Проверка на спец символ
def detect_special_characer(pass_string):
  regex= re.compile('[@_!#$%^&*()<>?/\|}{~:]')
  if(regex.search(pass_string) == None):
    res = False
  else:
    res = True
  return(res)
#получение списка товаров
def UpdateList():
    dbCursor.execute("select Tovar from BazaMSK")
    data = dbCursor.fetchall()
    print(data)
    new_list = []
    for word in data:
        new_str = ''
        for w in word:
            if detect_special_characer(w)==False:
                new_str += w
        new_list.append(new_str)
    new_str = ','.join(w for w in new_list if w)
    print(new_list)
    return new_list

Все стало работать решение нашел на

https://coderoad.ru/19970532/Как-проверить-строку-на-наличие-специального-символа#62941655

→ Ссылка
Автор решения: Андрей Коробейников
# Здесь вы посимвольно проверяете строку и
#  если символ из "списка спец символов" вы его не пропускаете
for w in word:
    if detect_special_characer(w)==False:
        new_str += w

Но ф-я detect_special_characer у вас для того что бы определять есть ли в строке спецсимволы. Проще применять для проверки на вхождение символа в строку или список (любой итерируемый объект!) оператор in (Например a in ['a','b','c'] => True)

Поэтому можно упростить ваш код до следующей функции:

def UpdateList():
    dbCursor.execute("select Tovar from BazaMSK")
    data = dbCursor.fetchall()
    special_chars = '[@_!#$%^&*()<>?/\|}{~:]'
    new_list = []
    for word in data:
        new_str = ''.join([ w for w in word if w not in special_chars ]) # Очищаем строку от лишних симвоов
        new_list.append(new_str.strip()) # Добавляем строку в список обрезая пробелы
    return new_list
→ Ссылка