Найти - Пользователи
Полная версия: ListBox сохранение и загрузка в файл
Начало » Python для новичков » ListBox сохранение и загрузка в файл
1
nick789
Как вариант, сохраняю так.

 from tkinter import *
...
    tmpFileName = "111111111.tmp"
    try:
        f = open(tmpFileName, 'w')
    except:
        return 
    list1_karteg=listbox1.get(0, END)
    string1 = ''
    for i in list1_karteg: # Соединяем в строку
        string1 += str(i) + '\n'
    string1 = string1.rstrip('\n') 
    f.write(string1)
    f.close()

Получаю файл с таким содержимым:
(200, 104, 0, 276, 182, 64, 76, 78)
(316, 158, 0, 448, 245, 124, 132, 87)
(505, 211, 0, 586, 274, 189, 81, 63)
(657, 251, 0, 708, 290, 249, 51, 39)
(809, 263, 0, 892, 320, 313, 83, 57)

Сам ListBox :
200 104 0 276 182 64 76 78
316 158 0 448 245 124 132 87
505 211 0 586 274 189 81 63
657 251 0 708 290 249 51 39
809 263 0 892 320 313 83 57

Пробую загрузить:
     tmpFileName = "111111111.tmp"
    try:
        f = open(tmpFileName, 'r') # Открывает файл для чтения
    except:
        return
    list1_karteg = f.read() # Читает файл
    f.close() # Закрыть дескриптор файла
    list1_karteg = list1_karteg.split('\n') 
    for i in list1_karteg:
        listbox1.insert(END,i)

Получаю в ListBox
(200, 104, 0, 276, 182, 64, 76, 78)
(316, 158, 0, 448, 245, 124, 132, 87)
(505, 211, 0, 586, 274, 189, 81, 63)
(657, 251, 0, 708, 290, 249, 51, 39)
(809, 263, 0, 892, 320, 313, 83, 57)

А должно быть:
200 104 0 276 182 64 76 78
316 158 0 448 245 124 132 87
505 211 0 586 274 189 81 63
657 251 0 708 290 249 51 39
809 263 0 892 320 313 83 57

Что можно придумать ?
PEHDOM
nick789 ой шото вы темните, если действительно
nick789
Сам ListBox :
200 104 0 276 182 64 76 78
316 158 0 448 245 124 132 87
505 211 0 586 274 189 81 63
657 251 0 708 290 249 51 39
809 263 0 892 320 313 83 57
то listbox1.get(0, END) вернет
('200 104 0 276 182 64 76 78', ‘316 158 0 448 245 124 132 87’, ‘505 211 0 586 274 189 81 63’, ‘657 251 0 708 290 249 51 39’, ‘809 263 0 892 320 313 83 57’)
соответственно :
 list1_karteg = ('200 104 0 276 182 64 76 78',
                '316 158 0 448 245 124 132 87',
                '505 211 0 586 274 189 81 63',
                '657 251 0 708 290 249 51 39',
                '809 263 0 892 320 313 83 57',)
string1 = ''
for i in list1_karteg:
    string1 += str(i) + '\n'
string1 = string1.rstrip('\n')
print(string1)
>>> 
200 104 0 276 182 64 76 78
316 158 0 448 245 124 132 87
505 211 0 586 274 189 81 63
657 251 0 708 290 249 51 39
809 263 0 892 320 313 83 57
>>> 
ровно тоже самое будет и в текстовом файле.
Откуда у вас в текстовом файле скобки и запятые, из представленого вами кода понять не представляется возможным.
nick789
Как вариант, сохраняю так.
Очевидно что сохраняете вы вовсе не так, и гдето еще присутствует еще один кусок кода котороый пересохраняет поверх вашего сохраненного файла уже по своему.
nick789
Прицепил картинку. Слева файл в редакторе, его время создание. Файл для проверки пересоздавал.
Справа сам ListBox.

В код добавил :
     list1_karteg=listbox1.get(0, END)
    print("prov ", list1_karteg)
prov  ((807, 219, 0, 949, 323, 65, 142, 104), (992, 323, 0, 1140, 422, 120, 148, 99), (1232, 401, 0, 1310, 484, 176, 78, 83), (1232, 487, 0, 1319, 586, 230, 87, 99))

Циферки в консоли другие, так как эту проверку делал после картинки, пришлось на создавать другие значения.

Пробую преобразовать:
 list1_karteg = f.read()
...    
for i in list1_karteg:
        print("type_2 ", type(i))   #  type_2  <class 'str'>
        print("444 ", i)
        x=i[1:-1]
        x=x.split(", ")
        print("x ", x)
        y = [-1, -1, 0,   -1, -1,     -1,      -1, -1]
        for k in [0, 1, 2, 3, 4, 5, 6, 7]:
            y[k]=int(x[k])
        print("type_3 ", type(y))
        print("555 ", y)
        listbox1.insert(END,y)
type_2  <class 'str'>
444  (1232, 487, 0, 1319, 586, 230, 87, 99)
x  ['1232', '487', '0', '1319', '586', '230', '87', '99']
type_3  <class 'list'>
555  [1232, 487, 0, 1319, 586, 230, 87, 99]

Руки мне отрывать не надо. Но больше ничего не придумал. Если есть идеи ?
PEHDOM
nick789
Руки мне отрывать не надо. Но больше ничего не придумал. Если есть идеи ?
Есть конечно, вопрос как у вас листбокс заполняется изначально? что там за данные? есть подозрение что там изначально не строки, а кортежи, в таком случае в самом листбоксе запятые и скобочки не отображаются, видны только цифры\буквы, но когда вы делаете str(кортеж) то оно вам возвращает строку с запятыми и скобочками, которые вы запихиваете в файл как есть с блекджеком скобками и зарпятыми, тут все правильно. А вот когда вы считываете из файла, то считываете просто строки, и пихаете их в листбокс как есть, вот он вам и отображает все как есть с скобками и запятыми. Чтобы этого не происходило нужно при считывании из файла строку обратно преобразовать в кортеж:
 from ast import literal_eval
.....
    listbox1.insert(END,literal_eval(i))
либо же не сохранять данные в виде просто текста, а использовать сериализацию, pickle например или JSON
nick789
список отправляю в listbox
PEHDOM
nick789
список отправляю в listbox
ну так и при чтении из файла нужно строки превращать в список\кортеж перед “отправкой” в листбокс.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB