Печать на этикетке Ткинтер - PullRequest
0 голосов
/ 22 октября 2019

Установив соединение с базой данных PostgreSQL, я хочу показать в метке таблицу ручной работы, сделав SELECT на моей базе данных. Все в порядке с подключением к базе данных и запросом. Но что-то пошло не так. Я помещаю чуть ниже исходный код и скриншот того, что показала программа.

from tkinter import *
import psycopg2 # LIBRARY FOR CONNECT TO THE POSTGRESQL DB

root = Tk()
menubar = Menu(root)

file = Menu(menubar, tearoff=0)
file.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="Principal", menu=file)

con = psycopg2.connect(  # CONNECT TO THE POSTGRESQL DB
    host="localhost",
    database="escola",
    user="postgres",
    password=248657
)

v = StringVar()

cur = con.cursor()  # CURSOR
cur.execute("SELECT id, nome, dt_nasc, nome_mae, nome_pai FROM alunos")  # EXECUTE QUERY

rows = cur.fetchall()

v.set('+----+-----------------------------+--------------------+-----------------------------+-----------------------------+')
v.set('|ID'.ljust(5) + '| Nome'.ljust(30) + '| Data de Nascimento |'.ljust(21) + ' Nome da     Mãe'.ljust(29) + '| Nome do Pai'.ljust(30) + '|')
v.set('+----+-----------------------------+--------------------+-----------------------------+------    -----------------------+')
for r in rows:
    v.set(f'|{r[0]}'.ljust(5) + f'|  {r[1]}'.ljust(30) + f'|  {r[2]}'.ljust(21) + f'|      {r[3]}'.ljust(30) + f'|  {r[4]}'.ljust(30) + '|')
v.set('+----+-----------------------------+--------------------+-----------------------------+------    -----------------------+')

cur.close()  # CLOSE CURSOR


box = Label(root, textvariable=v).pack() # THE LABEL

root.config(menu=menubar) # SETTING THE MENU
root.mainloop()

ScreeShot:

enter image description here

1 Ответ

1 голос
/ 22 октября 2019

Что здесь происходит, вы перезаписываете v каждой строкой. Вместо этого подумайте о том, чтобы написать многострочную строку, а затем установить это окончательное значение на v.

При этом есть несколько других опций, которые вы можете попробовать. Например, вы можете использовать текстовое поле, а затем просто insert() в конце новой строки, и это будет работать. Или еще лучше, когда вы работаете с наборами данных, вы, вероятно, захотите использовать Treeview для организации ваших данных.

Попробуйте это и дайте мне знать, если у вас есть какие-либо вопросы:

Замените это:

v.set('+----+-----------------------------+--------------------+-----------------------------+-----------------------------+')
v.set('|ID'.ljust(5) + '| Nome'.ljust(30) + '| Data de Nascimento |'.ljust(21) + ' Nome da     Mãe'.ljust(29) + '| Nome do Pai'.ljust(30) + '|')
v.set('+----+-----------------------------+--------------------+-----------------------------+------    -----------------------+')
for r in rows:
    v.set(f'|{r[0]}'.ljust(5) + f'|  {r[1]}'.ljust(30) + f'|  {r[2]}'.ljust(21) + f'|      {r[3]}'.ljust(30) + f'|  {r[4]}'.ljust(30) + '|')
v.set('+----+-----------------------------+--------------------+-----------------------------+------    -----------------------+')

При этом:

separator = '+----+-----------------------------+--------------------+-----------------------------+-----------------------------+'
prep_string = ''''''

prep_string = '{}{}\n'.format(prep_string, separator)
prep_string = '{}{}\n'.format('|ID'.ljust(5) + '| Nome'.ljust(30) + '| Data de Nascimento |'.ljust(21) + ' Nome da     Mãe'.ljust(29) + '| Nome do Pai'.ljust(30) + '|')
prep_string = '{}{}\n'.format(prep_string, separator)
for r in rows:
    prep_string = '{}{}\n'.format(f'|{r[0]}'.ljust(5) + f'|  {r[1]}'.ljust(30) + f'|  {r[2]}'.ljust(21) + f'|      {r[3]}'.ljust(30) + f'|  {r[4]}'.ljust(30) + '|')
prep_string = '{}{}\n'.format(prep_string, separator)

v.set(prep_string)

Если мы напечатаем значение prep_string, мы получим полный набор всего, что вы пытались добавить сразу. Обратите внимание, ниже я просто заключил ваши переменные в одну строку, чтобы показать, как это будет работать. Ваши значения должны представлять любые ваши данные.

+----+-----------------------------+--------------------+-----------------------------+-----------------------------+
|ID'.ljust(5) + '| Nome'.ljust(30) + '| Data de Nascimento |'.ljust(21) + ' Nome da     Mãe'.ljust(29) + '| Nome do Pai'.ljust(30) + '|
+----+-----------------------------+--------------------+-----------------------------+-----------------------------+
|ID'.ljust(5) + '| Nome'.ljust(30) + '| Data de Nascimento |'.ljust(21) + ' Nome da     Mãe'.ljust(29) + '| Nome do Pai'.ljust(30) + '|
|ID'.ljust(5) + '| Nome'.ljust(30) + '| Data de Nascimento |'.ljust(21) + ' Nome da     Mãe'.ljust(29) + '| Nome do Pai'.ljust(30) + '|
|ID'.ljust(5) + '| Nome'.ljust(30) + '| Data de Nascimento |'.ljust(21) + ' Nome da     Mãe'.ljust(29) + '| Nome do Pai'.ljust(30) + '|
+----+-----------------------------+--------------------+-----------------------------+-----------------------------+

Для версии текстового виджета попробуйте что-то вроде этого:

import tkinter as tk

separator = '+----+-----------------------------+--------------------+-----------------------------+-----------------------------+'

root = tk.Tk()
text = tk.Text(root, wrap='none', font='TkFixedFont', width=130)
text.pack()

text.insert('end', separator + '\n')
text.insert('end', '''|ID'.ljust(5) + '| Nome'.ljust(30) + '| Data de Nascimento |'.ljust(21) + ' Nome da     Mãe'.ljust(29) + '| Nome do Pai'.ljust(30) + '|''' + '\n')
text.insert('end', separator + '\n')
for r in range(3):
    text.insert('end', '''|ID'.ljust(5) + '| Nome'.ljust(30) + '| Data de Nascimento |'.ljust(21) + ' Nome da     Mãe'.ljust(29) + '| Nome do Pai'.ljust(30) + '|''' + '\n')
text.insert('end', separator + '\n')

root.mainloop()

Результаты:

enter image description here

...