xxm*_*exx 3 python tkinter python-2.7
题
ScrolledText在Tkinter中更改窗口小部件中特定行的对齐方式?背景
我目前正在开发一个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)
您正在使用名为的选项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方法插入文本时,您还可以提供标记列表.
很容易理解为什么尝试justify=CENTER为Text小部件设置失败:小部件没有这样的选项。
您想要的是使用参数创建一个标签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)
问题是你的 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_config该justify属性来创建命名标签配置,然后您可以将其应用于小部件内的文本范围,如示例所示。所以:
self.write.tag_config('justified', justify=RIGHT)
self.write.insert(INSERT, 'Ancients of Mu-Mu', 'justified')
Run Code Online (Sandbox Code Playgroud)
当然,这直接回答了您的另一个问题:
如何更改 Tkinter 中 ScrolledText 小部件中特定行的对齐方式?
要么首先将它们插入正确的标签,要么选择它们并在事后应用标签。