Member 14834148 Ответов: 1

Почему я получаю эту ошибку в tkinter


import tkinter as tk
from tkinter import ttk
import mysql.connector

conn = mysql.connector.connect(host='localhost', username='root', password='admin')
my_cursor = conn.cursor()


my_cursor.execute("CREATE DATABASE IF NOT EXISTS EMPLOYEE")
my_cursor.execute("USE EMPLOYEE")
my_cursor.execute("CREATE TABLE IF NOT EXISTS EMPLOYEE_DATA(ID INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(255), SALARY INT)")


def save_data(name, salary):
    query_insert = "INSERT INTO EMPLOYEE_DATA(NAME, SALARY) VALUES(%s, %s)"
    my_cursor.execute(query_insert, (name, salary))
    conn.commit()

def cal_sal(absent, leave, salarydb):
    total_days = 30
    int(salarydb)
    perday = salarydb / 30
    halfday = perday/2
    absent_days = absent*perday
    leave_days = leave*perday

    total_sal = salarydb-(absent_days+leave_days)
    print(total_sal)


# tkinter window-------------------------------------
root = tk.Tk()
root.title("Monthly Pay")
root.geometry('440x550')
root.resizable(0,0)

def reg_new_employee():
    newWindow = tk.Toplevel()
    newWindow.title("Register")
    newWindow.geometry('440x550')
    newWindow.resizable(0, 0)

    lb2 = tk.Label(newWindow, text='NEW ENTRY', font=('Calibri (Body)', 30))
    lb2.pack()

    lbname = tk.Label(newWindow, text='NAME:', font=(10))
    lbname.place(x=10 ,y=80)

    lbname_entry = tk.Entry(newWindow)
    lbname_entry.place(x=110, y=82)

    lbsalary = tk.Label(newWindow, text='SALARY:', font=(10))
    lbsalary.place(x=10, y=120)

    lbsalary_entry = tk.Entry(newWindow)
    lbsalary_entry.place(x=110, y=122)

    btn_save = tk.Button(newWindow, text='SAVE', command= lambda: save_data(lbname_entry.get(), lbsalary_entry.get()))
    btn_save.place(x=180, y=200)

def make_salary():
    win = tk.Toplevel()
    win.title("Make Salary")
    win.geometry('440x550')
    win.resizable(0, 0)

    lb_title = tk.Label(win, text = 'Select Employee: ', font = 10)
    lb_title.place(x = 5, y = 1)

# FETCH DATA TO SELECT EMPLOYEE COMBOBOX FROM DATABASE-----------
    query_fetchdata = "SELECT NAME FROM EMPLOYEE_DATA"
    my_cursor.execute(query_fetchdata)
    vl = tuple([name for name in my_cursor])

    combobox_name = ttk.Combobox(win, width=15, state = 'readonly')
    combobox_name['values'] = vl
    combobox_name.current(0)
    combobox_name.place(x =150 , y = 1)

    lb_p = tk.Label(win, text = 'Present: ', font = 10)
    lb_p.place(x=5, y=200)

    lb_a = tk.Label(win, text = 'Absent: ', font = 10)
    lb_a.place(x=5, y=240)

    lb_h = tk.Label(win, text = 'Leave: ', font = 10)
    lb_h.place(x=5, y=280)

    lb_p_entry = tk.Entry(win)
    lb_p_entry.place(x= 100, y= 200)

    lb_a_entry = tk.Entry(win)
    lb_a_entry.place(x=100, y=240)

    lb_h_entry = tk.Entry(win)
    lb_h_entry.place(x=100, y=280)

##### I'm getting error here
    query_getname = "SELECT salary FROM EMPLOYEE_DATA WHERE NAME= '%s'"
    val = combobox_name.get()
    my_cursor.execute(query_getname, (val,))

    btn_gen_sal = tk.Button(win, text = 'Generate Salary',)
    btn_gen_sal.place(x=180 ,y=450)

lbl = tk.Label(root, text = 'MONTHLY PAY', font = ('Calibri (Body)', 35))
lbl.pack()

btn_new_employee = tk.Button(root, text = 'New Employee', command = lambda: reg_new_employee())
btn_new_employee.place(x=180 ,y=200)

btn_make_salary = tk.Button(root, text = 'Make Salary', command = lambda: make_salary())
btn_make_salary.place(x=180 ,y=290)

root.mainloop()


ОШИБКА:

C:\Users\RISHI\AppData\Local\Programs\Python\Python37\python.exe C:/Users/RISHI/PycharmProjects/untitled/monthy_pay.py
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\RISHI\AppData\Local\Programs\Python\Python37\lib\site-packages\mysql\connector\connection_cext.py", line 489, in cmd_query
    raw_as_string=raw_as_string)
_mysql_connector.MySQLInterfaceError: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'F''' at line 1

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\RISHI\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/RISHI/PycharmProjects/untitled/monthy_pay.py", line 116, in <lambda>
    btn_make_salary = tk.Button(root, text = 'Make Salary', command = lambda: make_salary())
  File "C:/Users/RISHI/PycharmProjects/untitled/monthy_pay.py", line 102, in make_salary
    my_cursor.execute(query_getname, (val,))
  File "C:\Users\RISHI\AppData\Local\Programs\Python\Python37\lib\site-packages\mysql\connector\cursor_cext.py", line 266, in execute
    raw_as_string=self._raw_as_string)
  File "C:\Users\RISHI\AppData\Local\Programs\Python\Python37\lib\site-packages\mysql\connector\connection_cext.py", line 492, in cmd_query
    sqlstate=exc.sqlstate)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'F''' at line 1


Что я уже пробовал:

Пожалуйста, помогите мне, ребята, а также я новичок в python, поэтому, пожалуйста, объясните простым языком.

0x01AA

Попробуй
my_cursor.execute(query_getname, val)
вместо
my_cursor.execute(query_getname, (val,))

Richard MacCutchan

Это решение проблемы.

0x01AA

Поскольку я не знаю Python и заметил только странный синтаксис для значения параметра, я написал это только как комментарий. Но если вы уверены, что это ошибка, вы можете написать это как ответ.

Richard MacCutchan

Я не проверял, просто предположил, что ты знаешь.

1 Ответов

Рейтинг:
2

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!

Где - то - вероятно, в строке 116 вашего кода Python, но я понятия не имею, что это такое-ваш синтаксис SQL неверен. Поэтому используйте отладчик, чтобы сузить область поиска и посмотреть, что вы на самом деле отправляете. Мы не можем сделать это для вас!

Это может помочь: ПДБ — отладчика Python — питон 3.8.3 документации [^]