【问题标题】:Print on Label tkinter在标签上打印
【发布时间】:2019-10-22 17:40:48
【问题描述】:

与 PostgreSQL 数据库建立连接,我想在标签中显示一个手工制作的表格,在我的数据库上进行选择。数据库连接和查询都没问题。但是出了点问题。我把程序显示的源代码和屏幕截图放在下面。

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:

【问题讨论】:

  • 不管发生什么事,你最后都将v 设置为+----+-----...。所以结果总是一样的。
  • 我认为您正在尝试将值附加到 v,但您真正要做的是每次调用 v.set() 时都覆盖 v
  • 标签是多行数据的错误选择。您是否考虑过使用专为多行文本设计的 Text 小部件?

标签: python postgresql tkinter label psycopg2


【解决方案1】:

这里发生的是你用每一行覆盖 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()

结果:

【讨论】:

  • 感谢您的回答。关于您的第三个“prep_string”实例,解释器(PyCharm)指责未声明。我不明白这些信息。
  • @LucasRibeiro 这很奇怪。我正在使用 PyCharm,并没有对我说这样的话。到 3 日,您是否在谈论 prep_string = '''{}{}\n'''.format('|ID'.ljust(5)... 如果是这样,可能是说您的变量之一未声明。
  • 我对文字显示做了一些调整。我不知道是不是我的改编仍然有同样的问题。下面是截图: 第一个:i.imgur.com/8VAbXl5.png 第二个:i.imgur.com/DO9977Y.png
  • 第一个:i.imgur.com/8VAbXl5.png 第二个:i.imgur.com/DO9977Y.png
  • 完成! i.imgur.com/Q9CB4av.png 感谢您对@Mike - SMT 的支持!
猜你喜欢
  • 2016-03-25
  • 1970-01-01
  • 2016-01-15
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多