簡體   English   中英

將用戶輸入從Tkinter小部件傳輸到SQLite數據庫

[英]Transferring user input from Tkinter widget into SQLite database

我是一個嘗試使用Tkinter和SQLite的新Python用戶(v3.5)。 我在將用戶輸入從小部件(組合框和旋轉框)輸入到變量,然后將這些變量輸入到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()

謝謝!!

在代碼中,您從啟動時從ComboboxSpinbox獲得價值,而不是在它們改變價值時獲得價值。

通常,您必須將函數綁定到Spinbox "<<ComboboxSelected>>"command= ,這將使用get()獲取所選值。

但是您不需要它,因為您可以在按下按鈕時獲得價值。

查看更多評論。

我保留bind("<<ComboboxSelected>>", 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM