Nano Hash - криптовалюты, майнинг, программирование

Как я могу получить значение строки в столбце таблицы SQLite 3 с помощью виджета Tkinter Listbox?

У меня есть программа Python, подключенная к базе данных SQLite 3 с Tkinter на интерфейсе. Моя таблица базы данных (тематический список) состоит из трех столбцов: [id (уникальное целое число), тема (текст), серийный номер (уникальное целое число)]. Вот моя программа:

import sqlite3
from tkinter import *


conn = sqlite3.connect('database.db')
c = conn.cursor()
c.execute('SELECT COUNT() FROM subjectlist')
number = (c.fetchone()[0])

c.execute('SELECT * FROM subjectlist ORDER BY serial')
data = c.fetchall()
c.close
conn.close()


root = Tk()

listbox = Listbox(root)
listbox.pack()
for i in range(number):
    listbox.insert(END, data[i][1])

def get_serial():
    print(listbox.get(listbox.curselection()))

btn = Button(root, text="Show serial", command=lambda: get_serial())
btn.pack()

mainloop()

В настоящее время во время выполнения, когда я щелкаю элемент в списке (ведьма в основном показывает все значения столбца темы), а затем нажимаю кнопку Tkinter, я получаю тему, на которую я нажал. Вместо этого я хочу получить серийный номер, соответствующий теме. Обратите внимание, что столбец темы может иметь одинаковое значение в двух или более разных строках. Как мне добиться этого?

Вот еще один пример; Если у меня есть эта таблица:

Введите здесь описание изображения

Я хочу, чтобы графический интерфейс сначала отображал все предметы в списке. Затем я нажимаю Cats (в строке идентификатора 3), а затем нажимаю кнопку, я хочу, чтобы программа напечатала мне серийный номер 4.


  • Эта же таблица используется и со списком? 09.12.2020
  • Нет. Список показывает только собак, кошек, кошек и птиц друг под другом. Таким образом, идентификатор и серийный номер не будут видны конечному пользователю. 09.12.2020
  • Был бы признателен, взглянув на ответы ниже: D 09.12.2020
  • Извините, что отнял время. Был ночной сон, полный рабочий день, вечерние дополнительные встречи и малыши, висящие на моей ноге посредине. Я видел ваш ответ около 12 часов назад, но не мог его прокомментировать, так как тогда я тоже не мог его проверить. 09.12.2020

Ответы:


1

Ну, это тоже должно быть легко. Но поскольку в вашем коде есть база данных, которую я пока не могу протестировать, я сделал некоторые предположения. Попробуйте это:

def get_letter():
    conn = sqlite3.connect('database.db')
    c = conn.cursor()
    ids = listbox.curselection()[0]+1 # Getting the index number starting from 1
    c.execute('SELECT * FROM subjectlist WHERE `id`=?;',(ids,)) # Searching the database for items with selected items index
    rows = c.fetchall()
    print(rows[0]) # Print the first and hopefully the only item in the list
    conn.close() # Close the connection

Это должно печатать строки, соответствующие идентификатору, и, поскольку обычно идентификатор является уникальным числом, он будет печатать только одну строку. Я также предполагаю, что у вас есть и база данных, и список в одном и том же порядке, иначе это может не сработать.

08.12.2020
  • Это дало мне всю строку, а не только серийный номер. Я все еще могу извлечь этот серийный номер из этой строки, так что проблем нет. Так что я должен принять ваш ответ. Спасибо. Тем не менее, я снова разыграл себя, написав вопрос. Я забыл упомянуть, что таблица упорядочена по серийному номеру, а не по идентификатору. Тогда я мог бы просто заменить id из select stament на серийный номер, и это сработало бы, так что и здесь нет проблем. Однако все же у меня может отсутствовать серийный номер в таблице, если, например, я удалю строку Dogs. Тогда я думаю, что это сломается. Вы дали правильный ответ на поставленный вопрос. 09.12.2020

  • 2

    Вы можете использовать индекс элемента внутри listbox, чтобы получить serial из data:

    import sqlite3
    from tkinter import *
    
    conn = sqlite3.connect('database.db')
    c = conn.cursor()
    c.execute('SELECT * FROM subjectlist ORDER BY serial')
    data = c.fetchall()
    c.close()
    conn.close()
    
    
    root = Tk()
    
    listbox = Listbox(root)
    listbox.pack()
    
    for rec in data:
        listbox.insert(END, rec[1])
    
    def get_serial():
        selected = listbox.curselection()
        if selected:
            idx = selected[0]
            print(data[idx][2]) # print serial of selected item
    
    btn = Button(root, text="Show serial", command=get_serial)
    btn.pack()
    
    mainloop()
    

    Обратите внимание, что вы должны убедиться, что data и listbox синхронизированы.

    09.12.2020
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..