【问题标题】:how to fetch data stored in sqlite3 database and assign it to the variables in tkinter python如何获取存储在 sqlite3 数据库中的数据并将其分配给 tkinter python 中的变量
【发布时间】:2021-12-20 07:08:59
【问题描述】:

在下面的代码中,我将 value1 和 value2 保存到 sqlite3 数据库中,并将 txt_ 保存在名为 data 的文件夹中。 我在这里想要实现的是,当我重新运行程序并打开文件时,txt_ 文件应该在文本区域中打开,其中包含我保存时添加的行。当我单击添加按钮时, value1 和 value2 应该被更新并且新创建的行应该在下一行。 让我知道我的方法是否正确,如果不正确,请告诉我更好的方法。

代码:

from tkinter import *
from tkinter import messagebox
import sqlite3
import os

root = Tk()
root.geometry('400x400')

var_e = StringVar(None)
def create_my_db():
    conn = sqlite3.connect(database=r'my db.db')
    cur = conn.cursor()
    cur.execute("""CREATE TABLE IF NOT EXISTS "myLogs"
                (
                    "int_value" INTEGER,
                    "float_value" REAL
                )
                """)
    conn.commit()
create_my_db()

def add_lbl():
    global value1, value2
    value1 += 1
    value2 += 1
    sample = f'This is line {value1} which has value of {value2}\n'
    txt_.insert(END, sample)

def save():
    conn = sqlite3.connect(database=r'my db.db')
    cur = conn.cursor()
    cur.execute("""INSERT INTO myLogs VALUES (?,?)""",
                (
                    value1,
                    value2
                )
                )
    conn.commit()

    # labels to check if the values are stored in the database
    values_lbl.config(text=f'value 1 is [ {value1} ] & value 2 is [ {value2} ]')

def save_txt():
    file_txt = open(f'data/{value1}.txt', 'w')
    file_txt.write(txt_.get(1.0, END))
    file_txt.close()
    messagebox.showinfo('SAVED', 'Data saved to the database.')

def open_():
    for txt_file in os.listdir("data/"):
        if txt_file.split('.')[0] == f'{var_e.get()}':
            file_ = open(f"data/{txt_file}", "r")
            for i in file_:
                txt_.insert(END, i)
            file_.close()

value1 = 0
value2 = 0.9

values_lbl = Label(root, text=f'value 1 is [ {value1} ] & value 2 is [ {value2} ]')
values_lbl.pack()

btn_frame = Frame(root)
btn_frame.pack()

btn_add = Button(btn_frame, text='Add', command=add_lbl)
btn_add.pack(side=LEFT)

e = Entry(btn_frame, textvariable=var_e)
e.pack(side=LEFT)

btn_open = Button(btn_frame, text='Open', command=open_)
btn_save = Button(btn_frame, text='Save', command=lambda:[save(), save_txt()])
btn_open.pack(side=LEFT)
btn_save.pack(side=LEFT)

txt_ = Text(root)
txt_.pack(fill=BOTH, expand=True)

root.mainloop()

【问题讨论】:

  • 为什么你认为这不起作用?程序运行时会做什么?
  • 重新运行程序时不知道如何更新 value1 和 value2。我附上了图片,我在其中添加了三行,然后保存了它。然后我重新运行程序并打开文件。但 value1 和 value2 分别重置为 0 和 0.9。第 4 行应该是“这是第 4 行,值为 4.9”
  • 您需要在open_() 中更新value1value2
  • @acw1668,是的,你是对的,但我不知道怎么做。能给我看看吗?
  • 我想知道你为什么不知道你是怎么在add_lbl()里面做过类似的事情的。

标签: python-3.x sqlite tkinter integer


【解决方案1】:

当我发布这个问题时,我不知道如何运行查询来更新 value1 和 value2,这就是为什么我没有在 open_() 函数中提及查询。现在我开始知道应该如何完成该查询。所以在下面的代码中,我将查询添加到open_() 函数。现在完整的程序运行良好。

def open_():
    global value1, value2
    txt_.delete(1.0, END)
    for txt_file in os.listdir("data/"):
        if txt_file.split('.')[0] == f'{var_e.get()}':
            file_ = open(f"data/{txt_file}", "r")
            for i in file_:
                txt_.insert(END, i)
            file_.close()

    conn = sqlite3.connect(database=r'my db.db')
    cur = conn.cursor()

    cur.execute("""SELECT * FROM myLogs WHERE int_value=?""", (var_e.get(),))
    row = cur.fetchone()
    if row is None:
        messagebox.showerror("ERROR", 'Invalid input.')
    else:
        value1 = row[0]
        value2 = row[1]
    conn.commit()

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
相关资源
最近更新 更多