2016-12-01 52 views
0

我做了一個投票應用程序,它允許用戶在每個之間用逗號鍵入所有候選人,然後按回車來創建一個與這些候選人投票。For循環與sqlite總是插入第一個值

def newVote(event): 
       pos = position.get() 
       candidates = addCandEntry.get() 
       formatted = [x.strip() for x in candidates.split(',')] 
       for x in formatted: 
        c.execute("INSERT INTO current VALUES(?, ?, ?)", (pos,x,0,)) 
        c.execute('SELECT * FROM current WHERE position="Chief"') 
        print(c.fetchone()) 

如果我下面的值傳遞到了dad,mom,son,sister,grandma位置的Tkinter入門它將給這個產量在SQL

('Chief', 'dad', 0) 
('Chief', 'dad', 0) 
('Chief', 'dad', 0) 
('Chief', 'dad', 0) 
('Chief', 'dad', 0) 

我怎樣才能使添加的每個值,而不是隻是第一一?

以下是完整的代碼,如果你是因爲你正在使用fetchone()你總是會返回第一行('Chief', 'dad', 0)需要

import tkinter 
from tkinter import * 
import sqlite3 
import datetime 


# testing purposes only 
password = 'test' 

# create database file 
conn = sqlite3.connect('firefight') 
c = conn.cursor() 

# create tables 
c.execute('''CREATE TABLE IF NOT EXISTS users(
      username text, password text, admin boolean)''') 
c.execute('''CREATE TABLE IF NOT EXISTS positions(
      position text)''') 
c.execute('''CREATE TABLE IF NOT EXISTS current(
      position text, candidate text, votes int)''') 
c.execute('''CREATE TABLE IF NOT EXISTS past(
      date DATE, position text, candidate text, votes int, winner boolean)''') 

c.execute("INSERT INTO users VALUES('admin', 'VoteProgram', 'yes')") 


''' 
tables: 
users: 
    username text 
    password text 
    admin boolean 
positions: 
    position text 
current: 
    position text 
    candidate text 
    votes int 
past: 
    position text 
    candidate text 
    votes int 
    winner boolean 
''' 

# define root window 
root = tkinter.Tk() 
root.minsize(width=800, height = 600) 
root.maxsize(width=800, height = 600) 

# Admin sign in Label 
areAdmin = Label(root, text="Administrator sign in", font=("Arial", 18)) 
areAdmin.pack() 

# password label and password 
passwordLabel = Label(root, text="Password: ", font=("Arial", 12)) 
passwordLabel.place(x=300, y=30) 

# password entry 
adminPasswordEntry = Entry(root) 
adminPasswordEntry.place(x=385, y=32.5) 

# function for button 
def getEnteredPassword(event): 
    enteredPassword = adminPasswordEntry.get() 
    if enteredPassword == password: 
     # define admin window 
     admin = tkinter.Toplevel() 
     admin.minsize(width=800, height = 600) 
     admin.maxsize(width=800, height = 600) 
     # label saying to change password 
     changePasswordLabel = Label(admin, text="It is recommended to change your password the first time you log in.", 
            font=("Arial", 16), wraplength=500) 
     changePasswordLabel.pack() 
     # old password 
     changePassword_OldPasswordLabel = Label(admin, text="Old Password: ", font=("Arial", 12)) 
     changePassword_OldPasswordLabel.place(x=250, y=50) 
     changePassword_OldPassword = Entry(admin) 
     changePassword_OldPassword.place(x=365, y=52.5) 
     # new password 
     changePassword_NewPasswordLabel = Label(admin, text="New Password: ", font=("Arial", 12)) 
     changePassword_NewPasswordLabel.place(x=250, y=70) 
     changePassword_NewPassword = Entry(admin) 
     changePassword_NewPassword.place(x=365, y=72.5) 

     # function to change password 
     def passwordChangeCommand(event): 
      global password 
      oldPasswordValue = changePassword_OldPassword.get() 
      newPasswordValue = changePassword_NewPassword.get() 
      if oldPasswordValue == password: 
       password = newPasswordValue 
      else: 
       wrong = tkinter.Toplevel() 
       wrong.minsize(width=200, height = 100) 
       wrong.maxsize(width=200, height = 100) 
       Label(wrong, text="Sorry that password is incorrect!", font=("Arial", 24), anchor=W, wraplength=180, 
         fg="red").pack() 

     # submit button 
     newPasswordSubmit = Button(admin, text="Submit", width=10, command=passwordChangeCommand) 
     newPasswordSubmit.place(x=350, y=100) 

     newVoteLabel = Label(admin, text="Create New Vote", font=("Arial", 16)) 
     newVoteLabel.place(x=310, y=135) 

     # positions drop down 
     newVoteChoosePositionLabel = Label(admin, text="Choose the position you are voting for", font=("Arial", 12)) 
     newVoteChoosePositionLabel.place(x=265, y=170) 
     position = StringVar(admin) 
     position.set("Chief") 
     newVoteOption = OptionMenu(admin, position, "Chief", "First Lieutenant", "Second Lieutenant", "Third Lieutenant", 
            "Fourth Lieutenant") 
     newVoteOption.place(x=355, y=195) 

     #add candidates 
     addCandLabel = Label(admin, text="Add candidates below, separate each candidate with a comma then press enter when all candidates have been entered" 
          , font=("Arial", 11), wraplength=300, anchor=W) 
     addCandLabel.place(x=255, y=235) 
     addCandEntry = Entry(admin, width=40) 
     addCandEntry.place(x=272, y=295) 

     #new vote 
     newVoteButton = Button(admin, text="Create Vote", width=15) 
     newVoteButton.place(x=335, y=325) 

     def newVote(event): 
      pos = position.get() 
      candidates = addCandEntry.get() 
      formatted = [x.strip() for x in candidates.split(',')] 
      for x in formatted: 
       c.execute("INSERT INTO current VALUES(?, ?, ?)", (pos,x,0,)) 
       c.execute('SELECT * FROM current WHERE position="Chief"') 
       print(c.fetchone()) 


     addCandEntry.bind("<Return>", newVote) 
     newVoteButton.bind("<Button-1>", newVote) 

    else: 
     wrong = tkinter.Toplevel() 
     wrong.minsize(width=200, height=100) 
     wrong.maxsize(width=200, height=100) 
     Label(wrong, text="Sorry that password is incorrect!", font=("Arial", 24), anchor=W, wraplength=180, 
       fg="red").pack() 

# enter button for password 
passwordEnterButton = Button(root, text="Enter", width=10) 
passwordEnterButton.place(x=360, y=60) 
passwordEnterButton.bind("<Button-1>", getEnteredPassword) 
root.bind("<Return>", getEnteredPassword) 

mainloop() 
+0

我不知道蟒蛇非常多,但什麼是'addCandEntry.get()返回? – gian1200

+0

在插入循環之前打印'formatted'。這是5次同樣的事情嗎? –

+0

添加完整代碼以獲得更好的上下文 – Shniper

回答

2

。儘管如此,但對於爸爸,媽媽,兒子,妹妹,奶奶的五個單獨記錄應該已被附加到表格中。假設在你提交每個插入,然後輸出在一個單獨循環的current每一行調整:

for x in formatted: 
    c.execute("INSERT INTO current VALUES(?, ?, ?)", (pos,x,0,)) 

for row in c.execute('SELECT * FROM current WHERE position="Chief"'): 
    print(row) 

但是,好像你意,如果你使用一個整數主要是可以在每次插入後檢索最後一行鍵,id與每個記錄自動遞增:

c.execute('''CREATE TABLE IF NOT EXISTS users(
      id integer primary key, username text, password text, admin boolean)''') 
c.execute('''CREATE TABLE IF NOT EXISTS positions(
      id integer primary key, position text)''') 
c.execute('''CREATE TABLE IF NOT EXISTS current(
      id integer primary key, position text, candidate text, votes int)''') 
c.execute('''CREATE TABLE IF NOT EXISTS past(
      id integer primary key, date DATE, position text, candidate text, 
      votes int, winner boolean)''') 

這迫使你列舉出插入列:

c.execute("INSERT INTO users (username, password, admin)" + 
      " VALUES('admin', 'VoteProgram', 'yes')") 

然後fetchone()可用於:

for x in formatted: 
    c.execute("INSERT INTO current (position, candidate, votes) VALUES(?, ?, ?)", (pos,x,0,)) 
    c.execute('SELECT * FROM current WHERE id = (SELECT Max(sub.id) FROM current sub)') 
    print(c.fetchone())