Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 31.03.2020
Сообщений: 50

Обновить значения в treeview

31.03.2020, 20:15. Показов 3449. Ответов 7

Студворк — интернет-сервис помощи студентам
Всем привет, прошу помощи в реализации редактирования таблицы, ниже представлю код, который у меня получился, не понимаю как сделать так, чтобы при выборе определённой строки, значения из этой строки отображались в Entry, а после изменения нужного Entry, по нажатию на кнопку, обновляли таблицу. Прошу помочь, даже если есть реализация хотя бы 1 из нескольких пунктов.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
        def SaveUpdate():
            conn = sqlite3.connect("DB.db")
            cursor = conn.cursor()
            lstHeader1 = ""
            for i in HeaderList:
                lstHeader1 += i + ", "
            lstHeader1 = lstHeader1[:len(lstHeader1) - 2]
 
 
            cursor.execute("UPDATE test SET " + lstHeader + " WHERE " + HeaderList[0] + "=?",
                           (lstHeader1, update_entry.get()))
 
 
            childUpdate = Toplevel()
            childUpdate.title('Редактирование данных таблицы')
            childUpdate.geometry('600x300')
 
            childUpdate.main_menu = Menu()
            childUpdate.configure(menu=childUpdate.main_menu)
 
            childUpdate.file_menu = Menu()
            childUpdate.main_menu.add_cascade(label="Файл", menu=childUpdate.file_menu)
            childUpdate.file_menu.add_command(label="Сохранить изменения", command=SaveUpdate)
            childUpdate.file_menu.add_separator()
 
 
            self.master.conn = sqlite3.connect("db")
            self.master.cursor = self.master.conn.cursor()
            self.master.cursor.execute("PRAGMA table_info(test)")
            cc = self.master.cursor.fetchall()
            lst1 = []
            w = 0
            sh = 0
 
            for i in cc:
                counter = 0
                for a in i:
                    counter += 1
                    if counter == 2:
                        lst1.append(a)
                        lbl = Label(childUpdate, text=a)
                        lbl.grid(row=1, column=w, sticky="w")
                        update_entry = Entry(childUpdate, text='')
                        update_entry.grid(row=3, column=w, sticky="w")
                        w = w + 1
 
            lstHeader = ""
            for i in lst1:
                lstHeader += i + "=?, "
            lstHeader = lstHeader[:len(lstHeader) - 2]
Само сохранение редактирования происходит в функции SaveUpdate.
В итоге:
Нужно сделать заполнение Entry (которые располагаются в дочернем окне) данными из treeview главного окна
По нажатию на кнопку сохранения обновлять данные, которые были изменены в Entry.

Может быть, нужно как-то изменить Entry, чтобы они по другому создавались, или ещё что-нибудь. Ломаю голову, не могу придумать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2020, 20:15
Ответы с готовыми решениями:

Как обновить Treeview?
Всем привет!) У меня есть коллекция элементов которая прибиндина к treeview. Коллекция наполняется экземплярами класса. Проблема в том что...

Как обновить TreeView
Доброе время суток! Подскажите нубу как добавить ветку в TreeView не обновляя все дерево? Идея состоит в том, что добавляя в...

Обновить данные tkinter TreeView
Доброго времени суток! Я создаю таблицу с данными из БД(postgresql). После чего редактирую поле в самой программе, а потом создаю запрос с...

7
0 / 0 / 0
Регистрация: 29.03.2020
Сообщений: 9
31.03.2020, 21:51
Здравствуйте. Говорю сразу что я не сеньёр python разработчик)) Вот так забрать данные из Entry

Python
1
2
3
message = StringVar()
 
update_entry = Entry(childUpdate, textvariable=message)
Ну и здесь скорее всего как то так попробуйте

Python
1
2
3
cursor.execute("UPDATE test SET " + lstHeader + " WHERE " + HeaderList[0] + "=?",
 
                      (lstHeader1, message))
0
0 / 0 / 1
Регистрация: 31.03.2020
Сообщений: 50
01.04.2020, 01:41  [ТС]
Нет, такой способ у меня тоже не работает, потому что при таком коде, Entry заполняется одними и теме же данными, что неверно
0
0 / 0 / 0
Регистрация: 29.03.2020
Сообщений: 9
01.04.2020, 04:18
нет метода .commit он как раз и сохраняет транзакцию....

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
def SaveUpdate():
    
    conn = sqlite3.connect("DB.db")
    
    cursor = conn.cursor()
    
    lstHeader1 = ""
    
    for i in HeaderList:
        
        lstHeader1 += i + ", "
        
        lstHeader1 = lstHeader1[:len(lstHeader1) - 2]
        
        cursor.execute("UPDATE test SET " + lstHeader + " WHERE " + HeaderList[0] + "=?",
                       
                       (lstHeader1, update_entry.get()))
        
# Если мы не просто читаем, но и вносим изменения в базу данных - необходимо сохранить транзакцию
        
        conn.commit()
 
 
childUpdate = Toplevel()
 
childUpdate.title('Редактирование данных таблицы')
 
childUpdate.geometry('600x300')
 
childUpdate.main_menu = Menu()
 
childUpdate.configure(menu=childUpdate.main_menu)
 
childUpdate.file_menu = Menu()
 
childUpdate.main_menu.add_cascade(label="Файл", menu=childUpdate.file_menu)
 
childUpdate.file_menu.add_command(label="Сохранить изменения", command=SaveUpdate)
 
childUpdate.file_menu.add_separator()
 
 self.master.conn = sqlite3.connect("db")
 
 self.master.cursor = self.master.conn.cursor()
 
 self.master.cursor.execute("PRAGMA table_info(test)")
 
 cc = self.master.cursor.fetchall()
 
 lst1 = []
 
 w = 0
 
 sh = 0
 
 for i in cc:
     
     counter = 0
     
     for a in i:
         
         counter += 1
         
         if counter == 2:
             
             lst1.append(a)
             
             lbl = Label(childUpdate, text=a)
             
             lbl.grid(row=1, column=w, sticky="w")
             
             update_entry = Entry()
             
             update_entry.grid(row=3, column=w, sticky="w")
             
             w = w + 1
             
             lstHeader = ""
             
             for i in lst1:
                 
                 lstHeader += i + "=?, "
                 
                 lstHeader = lstHeader[:len(lstHeader) - 2]
0
0 / 0 / 1
Регистрация: 31.03.2020
Сообщений: 50
01.04.2020, 04:44  [ТС]
Если изменено больше 1 записи, в любом из Entry, кроме последнего, то данный способ работать не будет, потому что update_entry.get() берёт значения из последнего Entry
0
0 / 0 / 0
Регистрация: 29.03.2020
Сообщений: 9
01.04.2020, 23:58
в цикле вы создаёте условие которое выведет только один Entry...он и работает.сложно сказать какие ещё Entry не работают. я вижу только небольшой кусок кода.

Добавлено через 7 минут
хотя...вот тут не совсем понятно....

Python
1
2
3
4
5
6
7
8
9
for i in cc:
 
     counter = 0
     
      for a in i:
         
            counter += 1
         
            if counter == 2:
получается что условие никогда не выполнится? так как в начале цикла вы постоянно обнуляете переменную counter.
0
0 / 0 / 1
Регистрация: 31.03.2020
Сообщений: 50
02.04.2020, 03:17  [ТС]
Выполняется, всё было мной решено
0
8 / 5 / 3
Регистрация: 18.03.2019
Сообщений: 122
05.04.2020, 13:21
Сам запрос построен не правильно, UPDATE не принимает значения, которые были указаны
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2020, 13:21
Помогаю со студенческими работами здесь

Как обновить состояние TreeView?
Делаю небольшое приложение которое имея строку подключения подключается к бд, берет оттуда информацию о таблицах и полях и выводит в...

Обновить иконку выбранного узла TreeView по условию
Добрый день! Необходимо реализовать обновление иконки выбранного узла treeView по условию. Использую событие AfterSelect, задаю...

Обновить значения в БД access
Добрый день, подскажите как обновить значения и добавить новые (которых нет в таблице) БД из файла excel. Таблица в бд в виде...

Не получается обновить значения в базе
Доброго вечера, помогите решить проблему. В таблице users есть db_days в которую записываются дни, скрипт будет стоять на кроне и...

Как обновить значения из чекбокс?
Привет! имеются чекбоксы, они чекнуты в зависимости от соответствующих значений в БД (0/1). Теперь из формы редактирования я пытаюсь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru