4

问题

  1. 如何更改ScrolledTextTkinter 小部件中特定行的对齐方式?
  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()

当我运行它时,我得到一个错误。

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
>>> 

如果我将参数更改为justify参数之后font,我会收到消息框形式的不同错误。

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

编辑

我根据 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"
4

4 回答 4

13

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

但是,有一个justify文本标签选项。您可以将标签配置为有理由,然后将该标签应用于一行或多行。我从未使用过ScrolledText小部件,所以我不知道它是否具有与纯文本小部件相同的方法,但使用纯文本小部件,您会执行以下操作:

t = tk.Text(...)
t.tag_configure("center", justify='center')
t.tag_add("center", 1.0, "end")

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

您可以通过调整方法的参数来标记各个行tag_add。您还可以在使用该insert方法插入文本时给出标签列表。

于 2013-02-22T03:10:37.317 回答
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()
于 2013-02-22T03:06:34.627 回答
2

问题是您的 Python 语法,与以下内容无关tkinter

self.write = ScrolledText(self.maintextFrame,
                          justify(CENTER),
                          width = 100, height = 35, relief = SUNKEN,

这不是您通过justifyvalue传递关键字参数的方式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,

顺便说一句,将理由更改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')

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

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

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

于 2013-02-22T00:57:15.250 回答
1

可能使人们感到困惑的是,上面提到的http://effbot.org/tkinterbook/text.htm上的文档实际上确实justify列为 Text 小部件的一个选项,并且可能曾经有过,(似乎文本小部件应具有的选项)但http://www.tcl.tk/man/tcl8.4/TkCmd/text.htm上的文档没有列出justify选项,只有-justify标签。请注意,标签小部件可以处理多行文本并且确实有一个-justify选项。

于 2013-04-22T13:20:52.760 回答