如何在Tkinter文本框中设置对齐方式

xxm*_*exx 3 python tkinter python-2.7

  1. 如何ScrolledText在Tkinter中更改窗口小部件中特定行的对齐方式?
  2. 我原来错误的原因是什么?

背景

我目前正在开发一个Tkinter文本框应用程序,我正在寻找改变一条线的理由的方法.最终,我希望能够将特定行从LEFT ALIGN更改为RIGHT ALIGN等.现在,我只需要找出如何更改整个文本框的对齐方式,尽管我们将非常感谢您提供进一步的帮助.我一直在使用Effbot.org来帮助我完成任务.这是我的ScrolledText小部件代码:

def mainTextFUN(self):
    self.maintextFrame = Frame (root, width = 50, height = 1,
                           )

    self.maintextFrame.grid(row = 1, column = 1, sticky = N, columnspan = 1,
                            rowspan = 1)

    self.write = ScrolledText(self.maintextFrame,
                              justify(CENTER),
                              width = 100, height = 35, relief = SUNKEN,
                              undo = True, wrap = WORD,
                              font = ("Times New Roman",12),
                              )
    self.write.pack()
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到一个错误.

Traceback (most recent call last):
  File "D:\Python Programs\Text Editor\MyTextv5.py", line 132, in <module>
    app = Application(root)
  File "D:\Python Programs\Text Editor\MyTextv5.py", line 16, in __init__
    self.mainTextFUN()
File "D:\Python Programs\Text Editor\MyTextv5.py", line 57, in mainTextFUN
justify(CENTER),
NameError: global name 'justify' is not defined
>>> 
Run Code Online (Sandbox Code Playgroud)

如果我将justify参数更改为参数之后font,我会以消息框的形式出现另一个错误.

There's an error in your program:
*** non-keyword arg after keyword arg (MyTextv5.py, line 61)
Run Code Online (Sandbox Code Playgroud)

编辑

我根据abarnert的建议更改了代码.之后我加justify = CENTER,self.maintextFrame.尽管如此,我还是得到了另一个错误.

Traceback (most recent call last):
  File "D:\Python Programs\Text Editor\MyTextv5.py", line 132, in <module>
    app = Application(root)
  File "D:\Python Programs\Text Editor\MyTextv5.py", line 16, in __init__
    self.mainTextFUN()
  File "D:\Python Programs\Text Editor\MyTextv5.py", line 60, in mainTextFUN
    font = ("Times New Roman",12),
  File "C:\Python27\lib\lib-tk\ScrolledText.py", line 26, in __init__
    Text.__init__(self, self.frame, **kw)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 2827, in __init__
    Widget.__init__(self, master, 'text', cnf, kw)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1974, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
TclError: unknown option "-justify"
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 9

您正在使用名为的选项justify,但文本小部件不存在此选项.您是否正在阅读一些说明justify有效选项的文档?如果是这样,您需要停止阅读该文档.

但是,有一个justify文本标签选项.您可以将标记配置为具有对齐,然后将该标记应用于一行或多行.我从来没有使用过ScrolledText小部件,因此我不知道它是否与纯文本小部件具有相同的方法,但是使用纯文本小部件,您可以执行以下操作:

t = tk.Text(...)
t.tag_configure("center", justify='center')
t.tag_add("center", 1.0, "end")
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我们将创建和配置名为"center"的标记.标签可以包含您想要的任何名称.对于"中心"标记,我们给它一个"中心"的理由,然后将该标记应用于窗口小部件中的所有文本.

您可以通过调整tag_add方法的参数来标记单个行.使用该insert方法插入文本时,您还可以提供标记列表.


mmg*_*mgp 5

很容易理解为什么尝试justify=CENTERText小部件设置失败:小部件没有这样的选项。

您想要的是使用参数创建一个标签justify。然后,您可以使用该标签插入一些文本(或者您可以插入任何文本,然后将标签应用到特定区域):

import Tkinter

root = Tkinter.Tk()
text_widget = Tkinter.Text()
text_widget.pack(fill='both', expand=True)

text_widget.tag_configure('tag-center', justify='center')
text_widget.insert('end', 'text ' * 10, 'tag-center')

root.mainloop()
Run Code Online (Sandbox Code Playgroud)


aba*_*ert 2

问题是你的 Python 语法,而不是与以下内容相关的任何内容tkinter

self.write = ScrolledText(self.maintextFrame,
                          justify(CENTER),
                          width = 100, height = 35, relief = SUNKEN,
Run Code Online (Sandbox Code Playgroud)

这不是传递justify带有 value 的关键字参数的方式CENTER;您正在传递一个带有 value 的位置参数justify(CENTER)。因此,Python 尝试justify(CENTER)通过查找名为 的函数来进行计算justify,但没有找到,并引发NameError.

移动它没有帮助,它只是意味着你SyntaxError甚至可以到达 之前得到 a ,因为你在关键字参数之后NameError有一个位置参数,这是不允许的。justify(CENTER)font

正确的方法与在下一行中传递所有其他关键字参数的方法相同:

self.write = ScrolledText(self.maintextFrame,
                          justify = CENTER,
                          width = 100, height = 35, relief = SUNKEN,
Run Code Online (Sandbox Code Playgroud)

顺便说一句,将对齐方式更改为CENTER不会改变从左对齐到右对齐的任何内容;它将把它从左对齐更改为居中。你确定你不想要吗RIGHT


一旦你解决了语法问题,你就会遇到一个新问题,它tkinter 相关。该类ScrolledText只是将其关键字参数传递给该类Text,而Text小部件没有justify参数。

如果您阅读文档justify则用作与一系列文本关联的标签,而不是与小部件关联的标签。因此,您必须使用tag_configjustify属性来创建命名标签配置,然后您可以将其应用于小部件内的文本范围,如示例所示。所以:

self.write.tag_config('justified', justify=RIGHT)
self.write.insert(INSERT, 'Ancients of Mu-Mu', 'justified')
Run Code Online (Sandbox Code Playgroud)

当然,这直接回答了您的另一个问题:

如何更改 Tkinter 中 ScrolledText 小部件中特定行的对齐方式?

要么首先将它们插入正确的标签,要么选择它们并在事后应用标签。