如何在tkinter中很好地格式化多行字符串

时间:2017-09-08 06:22:59

标签: python-3.x tkinter

所以我对tkinter真的很陌生,而我想要做的就是在tkinter框架中显示输出。由于不知道任何其他方式,我试图将标签设置为字符串(我想要显示的输出),然后将标签打包到一个框架上。这有点工作我唯一的问题是它的格式化方式。字符串应该如下所示: enter image description here

但是当我把它放入tkinter时它看起来像这样: enter image description here

无论如何要解决这个或更好的方法将字符串输出到tkinter而不是使用标签。 我用来获取字符串的函数看起来像这样(getPrettyString函数有这么多elif的原因是我可以根据需要更改每列的大小):

def getPrettyString(record):
    string = ""
    for i in range(len(record)):
        if i == 0:
            string += '{:<25}'.format(record[i])
        elif i == 1:
            string += '{:<25}'.format(record[i])
        elif i == 2:
            string += '{:<25}'.format(record[i])
        elif i == 3:
            string += '{:<25}'.format(record[i])
        elif i == 4:
            string += '{:<25}'.format(record[i])
        elif i == 5:
            string += '{:<25}'.format(record[i])
        elif i == 6:
            string += '{:<25}'.format(record[i])
        elif i == 7:
            string += '{:<25}'.format(record[i])
return string


def writeTable(table):
    record = ''
    header = ["ID", "Assignment Name", "Submission Date", "Time of submission", "Group Assignment", "Group comments",
              "Assignment Text", "Marks"]
    record += getPrettyString(header)
    record += '\n'

    for team in table:
        record += getPrettyString(team)
        record += '\n'
    return record

我的tkinter代码如下所示:

class View_marks_student:
    def __init__(self, master):
        master.geometry('1080x1920')
        master.title("Student Marks Page")
        string = StringVar()
        string.set(writeTable(table_details))
        self.label = Label(master, textvariable=string, anchor=N, justify=LEFT)
        self.label.pack(anchor=NW, fill=BOTH, expand=1)

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

对于绘图表,使用.grid()要简单得多,看起来要好得多。

请参阅下面的示例:

from tkinter import *

root = Tk()

header = ["ID", "Assignment Name", "Submission Date", "Time of submission", "Group Assignment", "Group comments", "Assignment Text", "Marks"]

for i in range(10):
    Grid.rowconfigure(root, i, weight=1)
    if i == 0:
        for c in range(len(header)):
            Grid.columnconfigure(root, c, weight=1)
            Label(root, text=header[c], borderwidth=1, relief="solid").grid(column=c, row=i, sticky=N+S+E+W)
    else:
        for c in range(len(header)):
            Grid.columnconfigure(root, c, weight=1)
            Label(root, text=header[c]+" Row:"+str(i)+", Col:"+str(c), borderwidth=1, relief="solid").grid(column=c, row=i, sticky=N+S+E+W)

因此,我们创建了第一个for循环来表示表的行,i的每个增量递增到表的下一行。然后,我们为表的每一行(for的增量)创建一个嵌套的i循环,表示特定行的每一列中的每个单元格。

所以我们从头开始,访问行“0”,然后我们遍历标题列表,打印我们所在行的每一列中的每个单元格值,然后继续前进到下一行。

我们还使用rowconfigurecolumnconfigure等一些奇特的操作来将每行和每列的weight设置为1,这意味着单元格将展开以填充分配给他们的可用空间,并通过制作每个label我们在所有方向(sticky)创建N+S+E+W,边框将展开以适应指定的空间。

如果您有一组要输入到表中的数据,那么您可以创建一个list of列表并指定输出的数据,其中第一个迭代值是行,第二个是列。

所以这个:

for c in range(len(header)):
    Grid.columnconfigure(root, c, weight=1)
    Label(root, text=header[c]+" Row:"+str(i)+", Col:"+str(c), borderwidth=1, relief="solid").grid(column=c, row=i, sticky=N+S+E+W)

会成为这个(datalist list的{​​{1}}:

for c in range(len(header)):
    Grid.columnconfigure(root, c, weight=1)
    Label(root, text=data[i][c]+" Row:"+str(i)+", Col:"+str(c), borderwidth=1, relief="solid").grid(column=c, row=i, sticky=N+S+E+W)