【问题标题】:Transferring user input from Tkinter widget into SQLite database将用户输入从 Tkinter 小部件传输到 SQLite 数据库
【发布时间】:2016-11-12 01:49:57
【问题描述】:

我是一名新的 Python 用户 (v3.5),正在尝试使用 Tkinter 和 SQLite。我在将用户输入从小部件(组合和旋转框)输入变量然后将这些变量输入 SQLite 数据库时遇到问题。我试图自己诊断问题,我相信问题是将数据从小部件获取到变量中。我已经修改了代码并在网上搜索了解决方案,但我还没有能够得到任何工作。相关代码如下。为了简洁起见,我试图删除不相关的部分。

from tkinter import *
from tkinter.ttk import *
import sqlite3

conn = sqlite3.connect("database.db")
c = conn.cursor()


class GUI:
    def __init__(self):
        self.root = Tk()
        self.player_selection_and_score()
        self.process_button()
        self.create_table()

    def player_selection_and_score(self):
        player = StringVar
        top = LabelFrame(self.root)
        top.grid(column=0, row=0)


        player1_selection = Combobox(top, width=10, textvariable=player, state='readonly')
        player1_selection["values"] = ("Player1", "Player2", "Player3")
        player1_selection.grid(column=1, row=0, sticky="w")
        player1_selection.current(0)
        player1_selection.bind("<<ComboboxSelected>>")
        global player1_var
        player1_var = player1_selection.get()

        player1_score_entry = Spinbox(top, width=5, from_=0, to=10)
        player1_score_entry.grid(column=4, row=0)
        player1_score_entry.bind("<<SpinboxSelected>>")
        global player1_score_var
        player1_score_var = player1_score_entry.get()

def process_button(self):
    bottom = LabelFrame(self.root)
    bottom.grid(column=0, row=2)

    process_button = Button(bottom, text="Process Result", command=self.data_entry)
    process_button.pack()

def create_table(self):
    c.execute("CREATE TABLE IF NOT EXISTS fixtures (player1 TEXT, player1_score REAL)")

def data_entry(self):
    c.execute("INSERT INTO fixtures (player1, player1_score) VALUES (?, ?, ?, ?)", (player1_var, player1_score_var))
    conn.commit()

player1_var = GUI()
player1_score_var = GUI()

# Start GUI
gui = GUI()
gui.root.mainloop()

conn.close()
c.close()

我很确定问题出在这些特定的代码行上:

player1_selection.bind("<<ComboboxSelected>>")
global player1_var
player1_var = player1_selection.get()


player1_score_entry.bind("<<SpinboxSelected>>")
global player1_score_var
player1_score_var = player1_score_entry.get()

谢谢!!

【问题讨论】:

  • 您必须将函数绑定到"&lt;&lt;ComboboxSelected&gt;&gt;""&lt;&lt;SpinboxSelected&gt;&gt;",这将使用get() 来获取选定的值。现在您只在开始时获得价值。
  • 并使用self.player 而不是global

标签: python sqlite tkinter


【解决方案1】:

在您的代码中,您在开始时从 ComboboxSpinbox 获得值,而不是在它们更改值时。

通常你必须将函数绑定到Spinbox 中的"&lt;&lt;ComboboxSelected&gt;&gt;"command=,这将使用get() 来获取选定的值。

但是你不需要它,因为你按下按钮就可以获得价值。

在 cmets 中查看更多信息。

我保留了bind("&lt;&lt;ComboboxSelected&gt;&gt;", self.on_combobox_select)Spinbox(... , command=self.on_spinbox_select),但你不需要它。

import tkinter as tk
import tkinter.ttk as ttk
import sqlite3

class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.player_selection_and_score()
        self.process_button()
        self.create_table()

    def player_selection_and_score(self):
        #self.player = StringVar() # forgot (), use `self`
        top = tk.LabelFrame(self.root)
        top.grid(column=0, row=0)

        self.player1_selection = ttk.Combobox(top, width=10, state='readonly') # , textvariable=player
        self.player1_selection["values"] = ("Player1", "Player2", "Player3")
        self.player1_selection.grid(column=1, row=0, sticky="w")
        self.player1_selection.current(0)

        self.player1_selection.bind("<<ComboboxSelected>>", self.on_combobox_select)

        #global player1_var # better use `self.`
        #player1_var = player1_selection.get() # useless

        self.player1_score_entry = tk.Spinbox(top, width=5, from_=0, to=10, command=self.on_spinbox_select)
        self.player1_score_entry.grid(column=4, row=0)

        #global player1_score_var # better use `self.`
        #player1_score_var = player1_score_entry.get() # useless

    def on_combobox_select(self, event):
        print("Combobox:", event.widget.get())

    def on_spinbox_select(self):
        print("Spinbox:", self.player1_score_entry.get())

    def process_button(self):
        bottom = tk.LabelFrame(self.root)
        bottom.grid(column=0, row=2)

        process_button = tk.Button(bottom, text="Process Result", command=self.data_entry)
        process_button.pack()

    def create_table(self):
        c.execute("CREATE TABLE IF NOT EXISTS fixtures (player1 TEXT, player1_score REAL)")

    def data_entry(self):
        player1_var = self.player1_selection.get()
        player1_score_var = self.player1_score_entry.get()

        # too many `?`
        c.execute("INSERT INTO fixtures (player1, player1_score) VALUES (?, ?)", (player1_var, player1_score_var))
        conn.commit()

#player1_var = GUI() # ??? something stupid
#player1_score_var = GUI() # ??? something stupid

# --- main ---

conn = sqlite3.connect("database.db")
c = conn.cursor()

gui = GUI()
gui.root.mainloop()

c.close() # first close `c` later `conn`
conn.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2021-05-29
    • 2019-02-22
    • 2023-02-05
    • 2018-10-13
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多