2016-11-12 10 views
0

私はTkinterとSQLiteを使って作業する新しいPythonユーザ(v3.5)です。ウィジェット(コンボとスピンボックス)から変数へのユーザー入力を取得し、これらの変数をSQLiteデータベースに渡す際に問題が発生しています。私は自分自身で問題を診断しようとしましたが、問題はウィジェットから変数にデータを取得していると思います。私はコードを試してみて、解決策をオンラインで検索しましたが、まだ何かを手に入れることができませんでした。関連するコードは以下の通りです。私は簡潔さのために無関係なビットをハックしようとしました。ユーザ入力をTkinterウィジェットから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() 

ありがとうございました!!

+0

あなたは '()'値を選択し取得するには、Get使用する機能に ' "<< ComboboxSelected >>"'と ' "<< SpinboxSelected >>" を'バインドする必要があります。今では、スタート時にのみ価値が得られます。 – furas

+0

と 'global'の代わりに' self.player'を使います – furas

答えて

0

コードでは、値が変更されたときではなく、開始時にComboboxSpinboxの値が得られます。

は、通常は、選択された値を取得するためにget()を使用しますSpinbox"<<ComboboxSelected>>"command=に機能をバインドする必要があります。

ボタンを押したときに価値が得られるので、必要ありません。

コメントをもっと見る

私は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() 
関連する問題