0
0 комментариев

Выдали задание — создать приложение для работы с базой данных. Пока что с одной таблицей из базы. Изучали пока только Tkinter, поэтому и работаю в нём. Также для подключения к базе в PostgreSQL — Psycopg2.

Пока что создала только каркас для будущего приложения, красотой и функциональностью пока не занималась.

from tkinter import *
import psycopg2 # импорт библиотек
 
conn = psycopg2.connect(dbname = "bu_base", user = "postgres", password = "1", host = "localhost", port = '5432') #  подключение к базе данных в PostgreSQL
 
cursor = conn.cursor()
cursor.execute("SELECT kontakti.id_klienta FROM bu_base.public.kontakti") # выбор всех строчек из поля "id_klienta"
id_klienta = cursor.fetchall()
cursor.execute("SELECT kontakti.nazvanie FROM bu_base.public.kontakti")# выбор всех строчек из поля "nazvanie"
nazvanie = cursor.fetchall()
cursor.execute("SELECT kontakti.kontaktnoe_litso FROM bu_base.public.kontakti")# выбор всех строчек из поля "kontaktnoe_litso"
kontaktnoe_litso = cursor.fetchall()
cursor.execute("SELECT kontakti.telefon FROM bu_base.public.kontakti")# выбор всех строчек из поля "telefon"
telefon = cursor.fetchall()
cursor.execute("SELECT kontakti.adres FROM bu_base.public.kontakti")# выбор всех строчек из поля "adres"
adres = cursor.fetchall()
 
root = Tk()
 
 
# Cоздание функции, которая будет рисовать внешний интерфейс для работы с конкретной таблицей.
def Formi():
    text_from_entry_0 = entry_0.get()
    number_of_string=int(text_from_entry_0) # Считывание информации из поля и преобразование в целочисленный тип.
    entry_1 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
    label_1 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'id_klienta', font = 'Candara 14', fg = 'black')
    entry_1.insert(END, id_klienta[number_of_string])
 
    entry_2 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
    label_2 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'Nazvanie', font = 'Candara 14', fg = 'black')
    entry_2.insert(END, nazvanie[number_of_string])
 
    entry_3 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
    label_3 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'Kontaktnoe_litso', font = 'Candara 14', fg = 'black')
    entry_3.insert(END, kontaktnoe_litso[number_of_string])
 
    entry_4 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
    label_4 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'Telefon', ont = 'Candara 14', fg = 'black')
    entry_4.insert(END, telefon[number_of_string])
 
    entry_5 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
    label_5 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'Adres', font = 'Candara 14', fg = 'black')
    entry_5.insert(END, adres[number_of_string])
 
    # ^ Создание текста и полей для ввода со внесёнными значениями из базы данных.
 
    but_1 = Button(frame_1, bg = 'white', fg = 'black')
    but_1["text"] = "Следующая запись"
    but_2 = Button(frame_1, bg = 'white', fg = 'black')
    but_2["text"] = "Отмена"
    but_3 = Button(frame_1, bg = 'white', fg = 'black')
    but_3["text"] = "Сохранить"
 
    # Кнопки "Следующая запись", "Отмена" и "Сохранить" соответственно.
 
    label_1.pack()
    entry_1.pack()
    label_2.pack()
    entry_2.pack()
    label_3.pack()
    entry_3.pack()
    label_4.pack()
    entry_4.pack()
    label_5.pack()
    entry_5.pack()
 
    # Упаковка всех виджетов, кроме кнопок.
 
 
     but_1.place(x = 50, y = 370)
     but_2.place(x = 200, y = 370)
     but_3.place(x = 280, y = 370)
 
    # Упаковка кнопок с выбранными координатами.
 
frame_1 = Frame(root, bg = 'white', bd = 150) # Создание фрейма.
 
entry_0 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
label_0 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'Введите номер записи: ', font = 'Candara 14', fg = 'black')
 
# Текст и поле для ввода номера записи.
 
 
but_0 = Button(frame_1, bg = 'white', fg = 'black')
but_0["text"] = "Продолжить" # Создание кнопки "Продолжить".
but_0.bind('<Button-1>', Formi) # Вызов функции "Formi".
 
 
 
frame_1.pack()
label_0.pack()
entry_0.pack()
but_0.pack()
# Упаковка всех виджетов.
 
root.mainloop()

Изображение работы ниже.

То, как выглядит интерфейс при запуске.

Дальше я хочу заставить работать кнопки. С этого начинаются мои проблемы. (Хотя мне кажется, что для многих это и не проблемы вовсе)

Начинаю с кнопки «Следующая запись». Для этих целей я хочу, чтобы бралась переменная number_of_string и к ней добавлялась единица, после чего бы записи заменялись на последующие.

Для этого я выносила начало функции Formi в отдельную функцию.

def Schitivanie():
    text_from_entry_0 = entry_0.get()
    number_of_string=int(text_from_entry_0)
    return number_of_string

Также добавила функцию «Next»:

def Next():
    number_of_string += 1
    return number_of_string

После чего добавила события для кнопок «Продолжить» и «Следующая запись».

but_0.bind('<Button-1>', Schitivanie)
but_0.bind('<Button-1>', Formi)
but_1.bind('<Button-1>', Next)
bur_1.bind('<Button-1>', Formi)

Вылетала такая ошибка:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\ritad\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1550, in __call__
return self.func(*args)
TypeError: Formi() missing 1 required positional argument: 'number_of_string'

Ну поняла, что это потому что функции я создала, но их результат никуда не записала.

В итоге текст приобретает такой вид:

from tkinter import *
import psycopg2
 
 
def Schitivanie(entry_0):
    text_from_entry_0 = entry_0.get()
    numb_of_string=int(text_from_entry_0)
    return numb_of_string
 
number_of_string = Schitivanie()
 
def Formi(number_of_string):
 
    entry_1 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
    label_1 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'id_klienta', font = 'Candara 14', fg = 'black', )
    entry_1.insert(END, id_klienta[number_of_string])
 
    entry_2 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
    label_2 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'Nazvanie', font = 'Candara 14', fg = 'black')
    entry_2.insert(END, nazvanie[number_of_string])
 
    entry_3 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
    label_3 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'Kontaktnoe_litso', font = 'Candara 14', fg = 'black')
    entry_3.insert(END, kontaktnoe_litso[number_of_string])
 
    entry_4 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
    label_4 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'Telefon', font = 'Candara 14', fg = 'black')
    entry_4.insert(END, telefon[number_of_string])
 
    entry_5 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
    label_5 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'Adres', font = 'Candara 14', fg = 'black')
    entry_5.insert(END, adres[number_of_string])
 
 
    but_1 = Button(frame_1, bg = 'white', fg = 'black')
    but_1["text"] = "Следующая запись"
    but_2 = Button(frame_1, bg = 'white', fg = 'black')
    but_2["text"] = "Отмена"
    but_3 = Button(frame_1, bg = 'white', fg = 'black')
    but_3["text"] = "Сохранить"
 
 
    label_1.pack()
    entry_1.pack()
    label_2.pack()
    entry_2.pack()
    label_3.pack()
    entry_3.pack()
    label_4.pack()
    entry_4.pack()
    label_5.pack()
    entry_5.pack()
 
 
    but_1.place(x = 50, y = 390)
    but_2.place(x = 200, y = 390)
    but_3.place(x = 280, y = 390)
    but_1.bind('<Button-1>', Next)
    but_1.bind('<Button-1>', Formi)
    but_2.bind('<Button-1>', Cancel)
    but_3.bind('<Button-1>', Save)
 
 
 
def Next(number_of_string):
    number_of_string += 1
    return number_of_string
 
number_of_string = Next()
 
conn = psycopg2.connect(dbname = "bu_base", user = "postgres", password = "1", host = "localhost", port = '5432')
cursor = conn.cursor()
 
 
cursor.execute("SELECT kontakti.id_klienta FROM bu_base.public.kontakti")
id_klienta = cursor.fetchall()
 
cursor.execute("SELECT kontakti.nazvanie FROM bu_base.public.kontakti")
nazvanie = cursor.fetchall()
 
cursor.execute("SELECT kontakti.kontaktnoe_litso FROM bu_base.public.kontakti")
kontaktnoe_litso = cursor.fetchall()
 
cursor.execute("SELECT kontakti.telefon FROM bu_base.public.kontakti")
telefon = cursor.fetchall()
 
cursor.execute("SELECT kontakti.adres FROM bu_base.public.kontakti")
adres = cursor.fetchall()
 
 
root = Tk()
 
 
frame_1 = Frame(root, bg = 'white', bd = 150)
 
entry_0 = Entry(frame_1, width = 40, bd = 4, bg = 'white')
label_0 = Label(frame_1, width = 40, bd = 4, bg = 'white', text = 'Введите номер записи: ', font = 'Candara 14', fg = 'black', )
 
 
 
but_0 = Button(frame_1, bg = 'white', fg = 'black')
but_0["text"] = "Продолжить"
but_0.bind('<Button-1>', Schitivanie)
but_0.bind('<Button-1>', Formi)
 
frame_1.pack()
label_0.pack()
entry_0.pack()
but_0.pack()
root.mainloop()

Вылетает это:

Traceback (most recent call last):
File "C:\Users\ritad\Downloads\Графический интерфейс к контактам(2).py", line 10, in <module>
number_of_string = Schitivanie()
TypeError: Schitivanie() missing 1 required positional argument: 'entry_0'

В общем, несколько дней я билась над этим. Понимаю, что чем дольше я не прошу помощи, тем больше сама себя путаю. Поэтому и пишу сюда. За помощь буду благодарна.


Добавить комментарий