Значения содержащие цифры/пробелы в списке(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 шт):
Я нашел проблему (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