I'm writing an inventory database program. I'm a novice so I'm sure I have something wrong.
def select_item():
#Create a Database or Connect to one
conn = sqlite3.connect('inventory.db')
#Create Cursor
c = conn.cursor()
a = id_select.get()
c.execute("SELECT * FROM inventory WHERE oid = " + a)
records = c.fetchall()
for record in records:
Item_editor.insert(0, record[0])
Quantity_editor.insert(0, record[1])
Asset_tag_editor.insert(0, record[2])
Notes_editor.insert(0, record[3])
#Entry Fields
id_select = Entry(editor, width=30)
id_select.grid(row=0, column=1, pady=(20, 0))
Item_editor = Entry(editor, width=30)
Item_editor.grid(row=2, column=1)
Quantity_editor = Entry(editor, width=30)
Quantity_editor.grid(row=3, column=1)
Asset_tag_editor = Entry(editor, width=30)
Asset_tag_editor.grid(row=4, column=1)
Notes_editor = Entry(editor, width=30)
Notes_editor.grid(row=5, column=1)
#Button Time!
id_select = Button(editor, text="Select Item", command=select_item)
id_select.grid(row=1, column=0, columnspan=2, pady=10, padx=10, ipadx=100)
I did not initially have a function, but realized that I would need one for the command in the button. The error points to my variable a = id_select.get(), but I'm pretty sure that I have my entry fields added properly.
Your error is from the fact that id_select is a button. You initially had
id_select = Entry(editor, width=30) which has .get(), but you replaced id_select in id_select = Button(editor, text="Select Item", command=select_item) which does not have one. You should name your button something else.
Related
With the script below i am trying to get the error text from a span error text box for first name when a name is not entered and the user clicks on the submit button, from a registration screen with the HTML below.(https://www.walmart.com/account/signup. However I end up just getting none instead of the text. When i try to get the text from chrome console i receive the text with the xpath and css selector as "$x("//span[#class='span-error']")[2]" and "$$(".span-error")[2]". I would like some guidance as to what I am missing, i think have tried everything i can think of.
Test case:
Get to the link Enter nothing on the first name,Get a validation
error Assert the validation error Enter an invalid name as ":::" Get
a validation error (they seem to have a couple)and so on
from time import sleep
from conftest import os
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
# LoginScreenSelectors
sel_first_name = "#first-name-su"
sel_last_name = "#last-name-su"
sel_email = "#email-su"
sel_password = "#password-su"
sel_error_message = ".span-error:nth-of-type(2)"
sel_submit = f"""[data-automation-id="signup-submit-btn"]"""
sel_required_error = f"""[data-error="required"]"""
class Login():
'''This will signup to the applcaiton '''
def __init__(self, driver):
self.driver = driver
wait = WebDriverWait(self.driver, 20)
self.first_name = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, sel_first_name))
)
self.last_name = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, sel_last_name))
)
self.email = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, sel_email))
)
self.password = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, sel_password))
)
self.submit = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, sel_submit))
)
def login_to_website(self):
wait = WebDriverWait(self.driver, 10)
print(self.driver.title)
self.first_name.click()
self.first_name.send_keys(" ")
self.first_name.send_keys(Keys.TAB)
self.first_name_error_message = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, sel_error_message))
)
type(self.first_name_error_message)
error_messages = []
for messages in self.first_name_error_message:
print(error_messages.append(messages.text))
#if i could get this then i could simply get the first index and then keep filtering
it but even that is proving to be difficult.
Try out this to get all elements with error messages
error_messages = self.driver.find_elements(By.XPATH, "//*[#id="sign-up-form"]/div/span[2]']")
This is how I ended up solving it.
Get the xpath as f"""[data-error="required"]""" and then with a for loop cycle through all the error messages for input fields, I hope this will help anyone that is trying to take a stab at validating happy and negative testing on the same testcase.
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# LoginScreenSelectors
sel_first_name = "#first-name-su"
sel_last_name = "#last-name-su"
sel_email = "#email-su"
sel_password = "#password-su"
sel_submit = f"""[data-automation-id="signup-submit-btn"]"""
sel_required_error = f"""[data-error="required"]"""
class Register():
'''This wil register the user to the application '''
def __init__(self, driver):
self.driver = driver
wait = WebDriverWait(self.driver, 20)
self.first_name = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, sel_first_name))
)
self.last_name = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, sel_last_name))
)
self.email = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, sel_email))
)
self.password = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, sel_password))
)
self.submit = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, sel_submit))
)
def login_to_website(self):
wait = WebDriverWait(self.driver, 10)
'''This will check for validaitons'''
self.last_name.send_keys("Test Automation Last Name")
self.email.send_keys("a#b.com")
self.password.send_keys("password")
self.submit.click()
self.first_name_error_message = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, sel_required_error))
)
for first_name_required_message in self.first_name_error_message:
first_name_message = first_name_required_message.text.replace("\n", ":")
# print(first_name_message)
# print(first_name_message[first_name_message.find(":") + 1:])
assert first_name_message[first_name_message.find(":") + 1:] == "First name is required."
sleep(1)
self.last_name.clear()
self.first_name.click()
self.first_name.send_keys("Test Automation First Name ")
self.submit.click()
self.last_name_error_message = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, sel_required_error)))
for last_name_required_message in self.last_name_error_message:
last_name_message = last_name_required_message.text.replace("\n", ":")
assert last_name_message[last_name_message.find(":") + 1:] == "Last name is required."
self.email.clear()
self.last_name.click()
self.last_name.send_keys("Test Automation Last Name ")
self.submit.click()
self.email_error_message = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, sel_required_error)))
for email_required_message in self.email_error_message:
email_message = email_required_message.text.replace("\n", ":")
assert email_message[email_message.find(":") + 1:] == "Email address is required."
self.password.clear()
self.email.click()
self.email.send_keys("your#email.com")
self.submit.click()
self.password_error_message = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, sel_required_error)))
'''only way i could assert it '''
for password_required_message in self.password_error_message:
password_message = password_required_message.text.replace("\n", " ")
assert password_message[password_message.find("d") + 1:]\
.replace(" ", "") == "passwordisrequired."
self.password.click()
self.password.send_keys("something123$")
self.submit.click()
Hello Everyone i need help why my output result is none in the print('bla bla') line so from my output is None, None, None that actually insert from npm , nama , and jurusan but the output is none ,can anybody help me solve it thanks
import sqlite3
import tkinter
from tkinter import *
from tkinter import ttk
def Daftar():
window = Tk()
window.title("Welcome to TutorialsPoint")
window.geometry('400x400')
window.configure(background = "grey");
Lnpm = Label(window, text="Please Input Your npm: ").grid(row=0, column=0)
Lnama = Label(window,text="Please Input Your nama: ").grid(row=1, column=0)
Ljurusan = Label(window,text="Please Input Your jurusan: ").grid(row=2, column=0)
npm = Entry(window).grid(row = 0,column = 1)
nama = Entry(window).grid(row = 1,column = 1)
jurusan = Entry(window).grid(row = 2,column = 1)
def Clicked():
print("First Name: %s\nLast Name: %s\nLast Name: %s" % (npm, nama, jurusan))
connect = sqlite3.connect('Presensi.db')
cur = connect.cursor()
connect.execute("INSERT OR IGNORE INTO user(npm,nama,jurusan) values(?,?,?)", (str(npm),str(nama),str(jurusan)))
connect.execute("INSERT OR IGNORE INTO presensi(nama) values(?)", (str(nama),))
connect.commit()
cur.close()
btn = ttk.Button(window ,text="Register",command= Clicked()).grid(row=3,column=0)
window.mainloop()
You've got two big issues here:
the grid() function of the Entry object returns None and that's what npm, nama and jurusan are None. What you have to do is store the Entry object, not the value returned from grid().
you're not calling get() on the Entry objects to get their input values
What you can do is create a class in which you store the Entry objects. The callback function of the Button object can then be a method of the class.
I've reorganised your code to do this:
from tkinter import Tk, Label, Button, Entry
import sqlite3
class Daftar:
def __init__(self, master):
self.window = master
self.window.title("Welcome to TutorialsPoint")
self.window.geometry('400x400')
self.window.configure(background = "grey");
self.Lnpm = Label(self.window, text="Please Input Your npm: ").grid(row=0, column=0)
self.Lnama = Label(self.window,text="Please Input Your nama: ").grid(row=1, column=0)
self.Ljurusan = Label(self.window,text="Please Input Your jurusan: ").grid(row=2, column=0)
#Entry objects for later use
self.npm = Entry(self.window)
self.npm.grid(row = 0,column = 1)
self.nama = Entry(self.window)
self.nama.grid(row = 1,column = 1)
self.jurusan = Entry(self.window)
self.jurusan.grid(row = 2,column = 1)
self.btn = Button(self.window ,text="Register",command = self.Clicked).grid(row=3,column=0)
def Clicked(self):
#Get the entry values
npm = self.npm.get()
nama = self.nama.get()
jurusan = self.jurusan.get()
print("First Name: %s\nLast Name: %s\nLast Name: %s" % (npm, nama, jurusan))
connect = sqlite3.connect('Presensi.db')
cur = connect.cursor()
connect.execute("INSERT OR IGNORE INTO user(npm,nama,jurusan) values(?,?,?)", (npm,nama,jurusan))
connect.execute("INSERT OR IGNORE INTO presensi(nama) values(?)", (nama,))
connect.commit()
cur.close()
root = Tk()
my_gui = Daftar(root)
root.mainloop()
window.mainloop()
i am having a little problem i would need help with.This concerns python ttk.combobox widget
I am new to python just started coding a week ago.
I have a database which is populated by user input.This database is to store a user's stock input(e.g. items, cost, supplier ,etc).This part i have been able to do.
From the database, am using a 'for' loop to get each seperate item from my database query into a ttk.combobox so a user can make selections.
However my problem is,i get an error everytime.
I want the combobox to show all items within my item column from my database query.
From online sources ,i found out an example for ttk.combobox:
list = ['shoe', 'toy', 'bag']
combobox = ttk.Combobox(root)
combobox['values'] = list
This works fine,if i am to use a self-made list
However , i can't find an example for a ttk.combobox using query from sqlite3 in python
Thank you in advance for helping me out with this problem.
An example of how to do it and an explanation of what i did wrong will help me alot.
Forgive me for my poorly organised coding style,i hope to get better at it as time goes on.
from tkinter import *
from tkinter import ttk
import sqlite3
class Example:
def __init__(self,master):
self.master = master
self.win_label = Label(master, text="New Stock Entry")
self.win_label.grid(row=0, columnspan=2,)
self.item_label = Label(master, text="Item Name", fg='black')
self.item_label.grid(row=1, column=0, sticky=W, padx=5, pady=5)
self.unitprice_lab = Label(master, text="Unit Price", fg='black')
self.unitprice_lab.grid(row=2, column=0, sticky=W, padx=5, pady=5)
self.total_price = Label(master, text="Total Price", fg='black')
self.total_price.grid(row=3, column=0, sticky=W, padx=5, pady=5)
self.quantity_lab = Label(master, text="Quantity", fg='black')
self.quantity_lab.grid(row=4, column=0, sticky=W, padx=5, pady=5)
self.manufacturer_lab = Label(master,text="Manufacturer", fg='black')
self.manufacturer_lab.grid(row=5, column=0, sticky=W, padx=5, pady=5)
############### Variables to store input ################
self.item = StringVar()
self.unitp = IntVar()
self.unitn = IntVar()
self.quantity = IntVar()
self.man = StringVar()
############ Widgets############
self.item_entry = Entry(master, width=25,textvariable=self.item)
self.item_entry.grid(row=1, column=1, padx=5, pady=5)
self.unitprice_entry = Entry(master, width=25,textvariable=self.unitp)
self.unitprice_entry.grid(row=2, column=1, sticky=W, padx=5, pady=5)
self.total_price_entry = Entry(master,width=25,textvariable=self.unitn)
self.total_price_entry.grid(row=3, column=1, sticky=W, padx=5, pady=5)
self.quantity_entry = Entry(master,width=25,textvariable=self.quantity)
self.quantity_entry.grid(row=4, column=1, sticky=W, padx=5, pady=5)
self.manufacturer_entry = Entry(master, width=25,textvariable=self.man)
self.manufacturer_entry.grid(row=5, column=1, sticky=W, padx=5, pady=5)
# button for save
self.button_save = Button(master,text="Save",command= self.insert_Dbs)
self.button_save.grid(row=6, column=1, pady=15, padx=10, sticky=W)
def second_window(self): # Second Window to allow user selection
t = Toplevel()
t.geometry('350x290')
t.title('Student Input')
############# widgets ###############
self.label1 = ttk.Label(t, text = 'Student Name')
self.label1.grid(row =0 , column =0)
self.label2 = ttk.Label(t, text='Item Collected')
self.label2.grid(row=0, column=1)
self.label3 = ttk.Label(t, text='Quantity')
self.label3.grid(row=0, column=2)
self.entry1 =ttk.Entry(t, width = 20)
self.entry1.grid(row =1 , column =0)
self.entry2 = ttk.Entry(t, width=20)
self.entry2.grid(row=1, column=2)
self.comb = ttk.Combobox(t,width = 15).grid(row =1 , column =1)
self.comb['value'] = self.combo_input
def insert_Dbs(self): # Function to insert input into database
self.a1 = self.item.get()
self.a2 = self.unitp.get()
self.a3 = self.unitn.get()
self.a4 = self.quantity.get()
self.a5 = self.man.get()
#db = sqlite3.connect('stockdbExample.db')
'''db.execute('create table stocks (item text '
', item_uprice integer,'
' item_nprice integer,'
' quantity integer,'
' manufacturer text )')'''
db = sqlite3.connect('stockdbExample.db')
db.execute('insert into stocks (item,'
' item_uprice,'
' item_nprice,'
' quantity,'
' manufacturer) values (?, ?, ?, ?,?)',
(self.a1, self.a2, self.a3, self.a4, self.a5))
db.commit()
self.combo_input()
self.second_window()
def combo_input(self):
db = sqlite3.connect('stockdbExample.db')
cursor = db.execute('select item from stocks')
for row in cursor.fetchall():
return row
root = Tk()
c = Example(root)
root.mainloop()
First: you forgot () to execute function
self.comb['value'] = self.combo_input()
Second: inside combo_input you use return row so you return only first row, nothing more.
You have to create Python list with all values and then return it.
It can be something like this:
def combo_input(self):
db = sqlite3.connect('stockdbExample.db')
cursor = db.execute('select item from stocks')
result = []
for row in cursor.fetchall():
result.append(row[0])
return result
EDIT: Full, working example:
import tkinter as tk
import tkinter.ttk as ttk
import sqlite3
class Example:
def __init__(self,master):
self.master = master
self.db = sqlite3.connect('stockdbExample.db')
# use only once
self.create_db()
self.cb = ttk.Combobox(master)
self.cb.pack()
self.cb['values'] = self.combo_input()
def combo_input(self):
cursor = self.db.cursor()
cursor.execute('SELECT item FROM stocks')
data = []
for row in cursor.fetchall():
data.append(row[0])
return data
def create_db(self):
cursor = self.db.cursor()
cursor.execute('CREATE TABLE stocks (item text)')
cursor.execute('INSERT INTO stocks (item) VALUES("Hello")')
cursor.execute('INSERT INTO stocks (item) VALUES("World")')
cursor.execute('INSERT INTO stocks (item) VALUES("Tkinter")')
cursor.close()
self.db.commit()
root = tk.Tk()
Example(root)
root.mainloop()
I am trying to save a text file from the first page of a flatNotebook, write them to an EXTERNALLY defined sqLite database and write the values to a grid on the second page of the flatNotebook. The values are saved to the text file and written to the database successfully but I cannot get the values to populate the grid at the same time. They values show up in the grid after I close the program and restart it. I am having a hard time understanding how to call the function onAddCue(). I have tried so many things that I'm just confusing myself at this point. Please help me understand what I am doing wrong. Here is my entire code:
cue =[4,'NodeA',11,22,33,44,55,66,77,88,99]
class InitialInputs(scrolled.ScrolledPanel):
global cue
def __init__(self, parent, db):
scrolled.ScrolledPanel.__init__(self, parent, -1)
self.db = db
self.cur = self.db.con.cursor()
self.saveBtn = wx.Button(self, -1, "Save Current Values")
self.Bind(wx.EVT_BUTTON, self.onSave, self.saveBtn)
self.dirname = ""
def onSave(self, event):
global cue
dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.txt", wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
if dlg.ShowModal() == wx.ID_OK:
itcontains = cue
self.filename=dlg.GetFilename()
self.dirname=dlg.GetDirectory()
filehandle=open(os.path.join(self.dirname, self.filename),'w')
filehandle.write(str(itcontains))
filehandle.close()
dlg.Destroy()
row = cue[0] - 1
InsertCell ="UPDATE CUES SET 'Send'=?,'RED'=?,'GREEN'=?,'BLUE'=?,'RGB_Alpha'=?,'HUE'=?,'SAT'=?,'BRightness'=?,'HSB_Alpha'=?,'Fade'=? WHERE DTIndex=%i" %row
self.cur.execute(InsertCell, cue[1:])
self.db.con.commit()
GridPanel().grid.onAddCue() #This is the part that's not working
class Grid(gridlib.Grid):
global cue
def __init__(self, parent, db):
gridlib.Grid.__init__(self, parent, -1)
self.CreateGrid(20,10)
for row in range(20):
rowNum = row + 1
self.SetRowLabelValue(row, "cue %s" %rowNum)
self.db = db
self.cur = self.db.con.cursor()
meta = self.cur.execute("SELECT * from CUES")
labels = []
for i in meta.description:
labels.append(i[0])
labels = labels[1:]
for i in range(len(labels)):
self.SetColLabelValue(i, labels[i])
all = self.cur.execute("SELECT * from CUES ORDER by DTindex")
for row in all:
row_num = row[0]
cells = row[1:]
for i in range(len(cells)):
if cells[i] != None and cells[i] != "null":
self.SetCellValue(row_num, i, str(cells[i]))
self.Bind(gridlib.EVT_GRID_CELL_CHANGED, self.CellContentsChanged)
def CellContentsChanged(self, event):
x = event.GetCol()
y = event.GetRow()
val = self.GetCellValue(y,x)
if val == "":
val = "null"
ColLabel = self.GetColLabelValue(x)
InsertCell = "UPDATE CUES SET %s = ? WHERE DTindex = %d"%(ColLabel,y)
self.cur.execute(InsertCell, [(val),])
self.db.con.commit()
self.SetCellValue(y, x, val)
class GridPanel(wx.Panel):
def __init__(self, parent, db):
wx.Panel.__init__(self, parent, -1)
self.db = db
self.cur = self.db.con.cursor()
grid = Grid(self, db)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(grid)
self.SetSizer(sizer)
self.Fit()
def onAddCue():
global cue
row = cue[0] - 1
col=0
while col < 10:
for i in cue[1:]:
grid.SetCellValue(row, col, str(i))
col = col+1
class GetDatabase():
def __init__(self, f):
# check db file exists
try:
file = open(f)
file.close()
except IOError:
# database doesn't exist - create file & populate it
self.exists = 0
else:
# database already exists - need integrity check here
self.exists = 1
self.con = sqlite.connect(f)
class Frame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1,"Stage Lighting", size=(800,600))
panel = wx.Panel(self)
notebook = wx.Notebook(panel)
page1 = InitialInputs(notebook, db)
page2 = GridPanel(notebook, db)
notebook.AddPage(page1, "Initial Inputs")
notebook.AddPage(page2, "Grid")
sizer = wx.BoxSizer()
sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5)
panel.SetSizer(sizer)
self.Layout()
if __name__ == "__main__":
db = GetDatabase("data.db")
app = wx.App()
logging.basicConfig(level=logging.DEBUG)
Frame().Show()
app.MainLoop()
Apparently, the question is about python syntax errors!
onAddCue is a method belonging to the class GridPanel. The class is instantiated in the variable page2.
So, you need to call the method something like this:
page2.OnAddCue()
I am a beginner in tkinter. I am making a list of names. You can delete, select and edit it, but if I don't select anything in the list and click these buttons, it says:
Exception in Tkinter callback Traceback (most recent call last): File
"C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__ return
self.func(*args) File "C:\Users\user\Desktop\HOW_TOUGH - NEW\Change_user.py",
line 60, in Edit (idx, ) = d ValueError: need more than 0 values to unpack'''
I am planning to disable the buttons if the user doesn't click anything but I am not expert enough. Here's my code (it's a child window)
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
class Nick:
def __init__(self, master ):
self.master = master
self.window = Toplevel(master)
self.window.title('Change User')
self.window.geometry('300x300')
self.window.minsize(300, 300)
self.window.maxsize(300, 300)
self.nickname = StringVar()
self.lb = Listbox(self.window, selectmode = 'SINGLE')
f= open('users.txt','r')
rec = f.readlines()
f.close()
for i in rec:
p = i.find('|')
nickname = i[:p]
self.lb.insert(END, nickname)
self.lb.pack()
self.Ed = ttk.Button(self.window, text = 'Edit', command = self.Edit).pack()
self.Del = ttk.Button(self.window, text = 'Delete', command = self.Delete).pack()
self.Bac = ttk.Button(self.window, text = 'Back', command = self.Back).pack()
self.Okay = ttk.Button(self.window, text = 'Ok', command = self.Ok).pack()
def Back(self):
self.window.destroy()
def Delete(self):
d = self.lb.curselection()
(idx, ) = d
self.lb.delete(idx)
f = open('users.txt','r')
r = f.readlines()
f.close()
rec = r[idx]
r.remove(rec)
f = open('users.txt','w')
new = ''.join(r)
r = f.write(new)
f.close()
messagebox.showinfo(title='Success', message = 'Delete successful')
def Edit(self):
d = self.lb.curselection()
(idx, ) = d
import Edit as Edet
Edet.Edit(self.master, idx)
def Ok(self):
d = self.lb.curselection()
(idx, ) = d
get = self.lb.get(idx)
self.window.destroy()
print (get)
print (d)
The method curselection() returns an empty tuple when nothing is selected. You can skip those methods just by adding a
if not d:
return
If you want to gray out your buttons, you can do this:
button["state"] = DISABLED
Note that this won't work currently with your code as you did this:
self.button = ttk.Button(...).pack()
The problem lies in the call of pack() which returns None, effectively binding self.button to None. Just assign the button object to the variable first and then pack it. Furthermore, it's not recommended to import * from Tkinter because you're dropping ~190 names in your namespace. Just use
import tkinter as tk