Подсчет строк и запись данных

Автор Vashnaemnik, 09.10.24, 13:29:11

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Валерий Изранов

Может быть из Combobox_ов и получится какая нибудь таблица,
но таблица Excel многократно лучше.
Ее не надо создавать. Ее нужно научиться использовать.

p3452

"Каша, опять Каша!"...
В Вашем случае вижу массив строк и grid (экранное отображение, предыдущего).
Но, не в этом суть.
Можно, конечно назвать "таблицей" любой массив и grid..., но не тогда, когда речь идет о базе данных!
Допустим, Вы оговорились и речь идет не о Базе данных и Таблицах базы данных, а о Grid-e, тогда доступ к ЛЮБОЙ ячейке аналогичен - Grid[i,j].
 

Vashnaemnik

Цитата: p3452 от 15.10.24, 16:37:46"Каша, опять Каша!"...
В Вашем случае вижу массив строк и grid (экранное отображение, предыдущего).
Но, не в этом суть.
Можно, конечно назвать "таблицей" любой массив и grid..., но не тогда, когда речь идет о базе данных!
Допустим, Вы оговорились и речь идет не о Базе данных и Таблицах базы данных, а о Grid-e, тогда доступ к ЛЮБОЙ ячейке аналогичен - Grid[i,j].
 
Спасибо, попробую теперь перевести и переварить  :)
Я мощный разработчик оборудования, но никакой программист  :)

p3452

#23
Ну тогда, еще пару вариантов для Grid-а:
Grid.Columns[j] - доступ к колонке j,
Grid.Rows - доступ к строке i.
Можно еще и так (но не уверен что для Python это прокатит):
Grid.Columns[j] - доступ к ячейке i в колонке j,
Grid.Rows [j] - доступ к ячейке j в строке i.

p3452

#24
Вот ТАК должно быть в предыдущем сообщении:
Grid.Rows [ i ] - доступ к строке i.
изображение_2024-10-15_190303976.png
Форум ГЛЮЧИТ не принимает  сочетание "[][]"...

Михаил88

#25
пример.rar

Screenshot_1.png

Для примера создаете вторую строчку вписываете во вторую ячейку данные и жмете на кнопку значение.
Так получаете значение в ячейки из 2 строки, 2 столбца.
    def clicked_1(self):
        print(dannie_strok[1][1].get())


так можно пробежаться по всем ячейкам
    def clicked_1(self):
        for row in dannie_strok:
            for column in row:
                print(column.get())

Vashnaemnik

Цитата: Михаил88 от 15.10.24, 18:52:24пример.rar

Screenshot_1.png

Для примера создаете вторую строчку вписываете во вторую ячейку данные и жмете на кнопку значение.
Так получаете значение в ячейки из 2 строки, 2 столбца.
    def clicked_1(self):
        print(dannie_strok[1][1].get())


так можно пробежаться по всем ячейкам
    def clicked_1(self):
        for row in dannie_strok:
            for column in row:
                print(column.get())

Спасибо Михаил.
Как всегда, все четко.
Сейчас попробую все это разобрать.
Надеюсь вы просто это повесили на кнопку. И не обязательно это делать там, где я прописывал таблицу свою.

Vashnaemnik

Цитата: Михаил88 от 15.10.24, 18:52:24пример.rar

Screenshot_1.png

Для примера создаете вторую строчку вписываете во вторую ячейку данные и жмете на кнопку значение.
Так получаете значение в ячейки из 2 строки, 2 столбца.
    def clicked_1(self):
        print(dannie_strok[1][1].get())


так можно пробежаться по всем ячейкам
    def clicked_1(self):
        for row in dannie_strok:
            for column in row:
                print(column.get())

Михаил, еще раз спасибо.
Все, со всех строк забираю нужные мне столбцы и свожу их в списки.
for i in range(len(Tablica_shtycerov.dannie_strok)):
    DN = Tablica_shtycerov.dannie_strok[i][2].get()
    PN = Tablica_shtycerov.dannie_strok[i][3].get()
    Isp = Tablica_shtycerov.dannie_strok[i][7].get()
    Obratka = Tablica_shtycerov.dannie_strok[i][8].get()
    Vilet = Tablica_shtycerov.dannie_strok[i][14].get()
    list = DN, PN, Isp, Obratka, Vilet
    print (list)
Сейчас буду их пытаться сравнить, что бы удалял, если есть повторяющиеся строки.

Vashnaemnik

Цитата: Vashnaemnik от 16.10.24, 10:07:40Михаил, еще раз спасибо.
Все, со всех строк забираю нужные мне столбцы и свожу их в списки.
for i in range(len(Tablica_shtycerov.dannie_strok)):
    DN = Tablica_shtycerov.dannie_strok[i][2].get()
    PN = Tablica_shtycerov.dannie_strok[i][3].get()
    Isp = Tablica_shtycerov.dannie_strok[i][7].get()
    Obratka = Tablica_shtycerov.dannie_strok[i][8].get()
    Vilet = Tablica_shtycerov.dannie_strok[i][14].get()
    list = DN, PN, Isp, Obratka, Vilet
    print (list)
Сейчас буду их пытаться сравнить, что бы удалял, если есть повторяющиеся строки.
Да, нашел время снова продолжить и сразу понял  :)))))  что наивно полагал что продолжу.
Я то циклом прохожу, но каждый раз перезаписываю переменную (list), а следовательно сравнивать нечего  :-)))
Как мне сделать ,что бы переменных появилось столько же, сколько и итераций?
Это как то через вложенный цикл делать?

UU

Цитата: Vashnaemnik от 16.10.24, 14:20:44Это как то через вложенный цикл делать?
Рекурсия - называется.

Vashnaemnik

Цитата: UU от 16.10.24, 14:21:54Рекурсия - называется.
А могу ли я это сделать через append, выведу все одним большим списком. А после поделю его на части, кратно 5. Получив несколько мне нужных списков. Которые уже сравню на повторы.
Или не правильно копаю?

Михаил88

Я думаю, что прежде чем Вам писать дальше код, нужно хорошо подумать. Можно было сделать все проще. Зачем было создавать импровизированную таблицу из entry?
Может стоило все сделать с помощью виджета Treeview?

Вы можете описать всю логику вашей программы, что она будет делать, как и какие данные в нее будут попадать? Что будет делать пользователь. А так скидываете разрозненную информацию, что не очень понятно.

Vashnaemnik

Цитата: Михаил88 от 16.10.24, 15:01:55Я думаю, что прежде чем Вам писать дальше код, нужно хорошо подумать. Можно было сделать все проще. Зачем было создавать импровизированную таблицу из entry?
Может стоило все сделать с помощью виджета Treeview?

Вы можете описать всю логику вашей программы, что она будет делать, как и какие данные в нее будут попадать? Что будет делать пользователь. А так скидываете разрозненную информацию, что не очень понятно.
Если в двух словах, то я хочу, чтобы программа строила полную 3D модель аппарата колонного типа. Это корпус цилиндрический, стоящий на опоре, и в нем установлены множество штуцеров.
Та часть которую я делаю. отвечает за построение штуцеров. Пользователь должен вбить данные по всем штуцерам. Дальше, как раз что я сейчас делаю, программа должна выбрать часть столбцов, чтобы выстроить список всех штуцеров, которые нужно построить. Бывают штуцера разного назначения, но одинаковые по диаметру, привариваему фланцу, ответной детали. Чтобы не делал одинаковых сборок, нужно от одинаковых как раз списков избавиться. Дальше начнется построение этих сборок штуцеров. Туда входит патрубок, фланец приварной, прокладка, ответный фланец или заглушка, крепеж. Все это выстроить сборками и сохранить. Дальше, когда напарник сделает корпус аппарата, данные сборки, согласно уже изначальной таблицы штуцеров, будут расставляться по корпусу аппарата. Вот в принципе все.

Vashnaemnik

Цитата: UU от 16.10.24, 14:21:54Рекурсия - называется.
Немного ознакомился с этим темным лесом.

# вывод ячеек со всех строк
list_1 = []
for i in range(len(Tablica_shtycerov.dannie_strok)):
    DN = Tablica_shtycerov.dannie_strok[i][2].get()
    PN = Tablica_shtycerov.dannie_strok[i][3].get()
    Isp = Tablica_shtycerov.dannie_strok[i][7].get()
    Obratka = Tablica_shtycerov.dannie_strok[i][8].get()
    Vilet = Tablica_shtycerov.dannie_strok[i][14].get()
    #list = DN, PN, Isp, Obratka, Vilet
    list_1.append((DN, PN, Isp, Obratka, Vilet))
#print(list)

# делим список на части кратно 5
list_del_5 = 5
spisok_list = [list_1[i:i + list_del_5] for i in range(0, len(list_1), list_del_5)]
#print (spisok_list)

# рекурсия
def remove_duplicate(start,oldlist,newlist):
    if start==len(oldlist):return newlist  #базовое состояние
    if oldlist[start] not in newlist:   #проверка наличия элемента в новом списке
        newlist.append(oldlist[start])
    return remove_duplicate(start+1,oldlist,newlist)  #рекурсивный вызов

res=remove_duplicate(0,spisok_list,[])   #вызов рекурсивной функции с правильными параметрами
print(res)

Разбил свой список на составные.
но он мне не удаляет повторы, выводит полный список.
 :%: дремучий для меня это лес  :-)))

Kilia

Для обработки табличных данных я бы смотрел в сторону библиотеки pandas
import pandas as pd

# Пример данных
data = {'col1': ['A', 'B', 'A', 'C', 'B'],
        'col2': ['X', 'Y', 'X', 'Z', 'Y'],
        'Количество': [10, 20, 30, 40, 50]}

df = pd.DataFrame(data)

# Группировка всех столбцов, кроме 'Количество', и суммирование 'Количество'
df_grouped = df.groupby([col for col in df.columns if col != 'Количество'], as_index=False).agg({'Количество': 'sum'})

print(df_grouped)

тут при совпадении всех столбцов кроме количества - строки объединяться, а кол-во просуммируется

Михаил88

Вот простой пример

data = [[1, 2, 3, 4, 5, 6, 77],
        [10, 2, 5, 7, 44, 55, 9988],
        [8, 5, 9, 10, 6, 20, 30],
        [1, 2, 3, 4, 5, 6, 777],
        [10, 2, 5, 7, 44, 55, 9977],
        [1, 2, 88, 4, 44, 6, 7]
        ]

new_data = []

for row in data:
    new_row = [row[0], row[1], row[3]]
    if new_row not in new_data:
        new_data.append(new_row)

print(new_data)


изображение_2024-10-17_084542094.png

Vashnaemnik

Цитата: Vashnaemnik от 16.10.24, 22:43:16Немного ознакомился с этим темным лесом.

# вывод ячеек со всех строк
list_1 = []
for i in range(len(Tablica_shtycerov.dannie_strok)):
    DN = Tablica_shtycerov.dannie_strok[i][2].get()
    PN = Tablica_shtycerov.dannie_strok[i][3].get()
    Isp = Tablica_shtycerov.dannie_strok[i][7].get()
    Obratka = Tablica_shtycerov.dannie_strok[i][8].get()
    Vilet = Tablica_shtycerov.dannie_strok[i][14].get()
    #list = DN, PN, Isp, Obratka, Vilet
    list_1.append((DN, PN, Isp, Obratka, Vilet))
#print(list)

# делим список на части кратно 5
list_del_5 = 5
spisok_list = [list_1[i:i + list_del_5] for i in range(0, len(list_1), list_del_5)]
#print (spisok_list)

# рекурсия
def remove_duplicate(start,oldlist,newlist):
    if start==len(oldlist):return newlist  #базовое состояние
    if oldlist[start] not in newlist:   #проверка наличия элемента в новом списке
        newlist.append(oldlist[start])
    return remove_duplicate(start+1,oldlist,newlist)  #рекурсивный вызов

res=remove_duplicate(0,spisok_list,[])   #вызов рекурсивной функции с правильными параметрами
print(res)

Разбил свой список на составные.
но он мне не удаляет повторы, выводит полный список.
 :%: дремучий для меня это лес  :-)))
Простите меня  :-)))  понимаю, что из части кода сложно понять.
Туплю я, но постепенно начинаю понимать консоль.
При объединении своих списков, я и так их получал объединенными, но разделенными  :)
Потом еще раз разделил, а потом рекурсию делал. Конечно будет материться.
Выкинул я деление строки, и все, рекурсия сделала свое дело.
Спасибо всем, что не игнорите меня. Просто я совсем еще новичок.
Сложно мне поддается терминология программирования  :)

Михаил88

Цитата: Vashnaemnik от 16.10.24, 14:20:44переменную (list),

Совет. Не нужно именам переменным давать названия встроенных функций и ключевых слов. Это убережет от дальнейших проблем.


Vashnaemnik

Цитата: Михаил88 от 17.10.24, 08:52:55Совет. Не нужно именам переменным давать названия встроенных функций и ключевых слов. Это убережет от дальнейших проблем.


Да Михаил, это уже понял. Переименовал.
Спасибо.
У меня теперь новая проблема. Я забрал все мне нужные данные из первой строки, дал и наименование переменных, запаковал в функцию. Вывел return.
И никак не получается передать переменные в другой класс, который в отдельном файле.
Так что пока в дремучем лесу просветов не видать :)

Vashnaemnik

Может кто подскажет принцип передачи переменных, когда функция и класс лежат в разных файлах.
функция в мейне
import Flanci_GOST_33259_2015_BD
def peredacha_dannih():
    # определение переменных для построения штуцера
    DN = (res[0][0])
    PN = (res[0][1])
    Dn_patrubok = (res[0][2])
    S_patrubok = (res[0][3])
    Isp = (res[0][4])
    Obratka = (res[0][5])
    Prokladka = (res[0][6])
    Vilet = (res[0][7])
    return DN, PN, Dn_patrubok, S_patrubok, Isp, Obratka, Prokladka, Vilet
Flanci_GOST_33259_2015_BD.dannie_shtucera()
пока в цикл не упаковываю, поэтому беру данные из первого списка.
А класс находится в другом файле, куда я должен передать DN и PN.
class dannie_shtucera():
       
    def __init__ (DN, PN):
       
        # диаметр 10 мм
        if DN == 10 and PN == 0.1:
тут как раз выберется одно из условий.