![](/img/trans.png)
[英]Can't get text input from Tkinter Text widget into sqlite3 database
[英]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()
謝謝!!
在代碼中,您從啟動時從Combobox
和Spinbox
獲得價值,而不是在它們改變價值時獲得價值。
通常,您必須將函數綁定到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.