Text 使用tk创建文本编辑器
是否可以使用Text 使用tk创建文本编辑器,text,tkinter,editor,tk,Text,Tkinter,Editor,Tk,是否可以使用tk创建一个文本编辑器,该编辑器可以支持语法突出显示,自动完成,甚至可以在以后扩展为特定语言的IDE 我找到了tkinterwidget,但不确定它是否支持这个功能 我认为,如果小部件可以在用户编写文本时对文本进行一些处理,那么它就可以用于此目的。绝对可以。tkinter文本小部件非常强大。你提到的每一件事都可以做到,甚至更多。您还可以实现代码折叠、嵌入图像、超链接、撤消等 以下是一些您可能会觉得有用的相关问题的答案: 可以使用来突出显示语法。这个答案有一个很小的例子: 行号和一个
tk
创建一个文本编辑器
,该编辑器可以支持语法突出显示
,自动完成
,甚至可以在以后扩展为特定语言的IDE
我找到了tkinter
widget,但不确定它是否支持这个功能
我认为,如果小部件可以在用户编写文本时对文本进行一些处理,那么它就可以用于此目的。绝对可以。tkinter文本小部件非常强大。你提到的每一件事都可以做到,甚至更多。您还可以实现代码折叠、嵌入图像、超链接、撤消等 以下是一些您可能会觉得有用的相关问题的答案:
- 可以使用来突出显示语法。这个答案有一个很小的例子:
- 行号和一个自定义事件,该事件在回答中提到小部件更改时触发:
- 此答案部分介绍了添加搜索功能:
- 不要重复,因为布莱恩·奥克利已经回答了这个问题,但答案是肯定的。他是对的。文本小部件非常强大。我从未见过另一个文本小部件与它的广泛功能相匹配
Tkinter是我找到的制作文本编辑器最方便的GUI库。事实上,我自己已经做了一段时间了。你对做一个感兴趣还是想找一个已经用Tkinter做过的
对我来说,语法高亮显示和自动完成并不是文本编辑器中最重要的功能。我更关心快速/方便的文件/项目访问、启动/编译/运行程序、Unicode或特殊字符输入、小部件颜色方案、导航键绑定、选项卡,以及为各种我喜欢的野生工具提供各种快捷方式,使我的生活更轻松(更有趣)。所以,我现在实际上刚刚开始语法高亮显示(在已经完成了大部分其他工作之后)。但是,是的,语法突出显示可以在Tkinter中完成
不过,实际上,您可能希望在文本编辑器中使用的许多功能甚至不需要对GUI库做太多的处理。例如,让它识别您正在编辑的文件类型,以便您可以使用正确的程序运行您的文件(或使用正确的编译器编译)。这真的与特金特没什么关系
如果您想实时聊天关于文本编辑器,请告诉我
Python附带的IDE IDLE似乎也是用Tkinter编写的。查看源代码有时是有帮助的,但是他们往往会以不同于我个人推荐的方式来做事情,尽管我确信有些人更喜欢它,而不是我喜欢的方式
Tkinter有一些缺点,但出于我的目的,它们比我在其他GUI库中看到的缺点要好。有些事情需要更多的工作,但大多数似乎也提供了更多的灵活性。有些事情也需要更少的工作。令人印象深刻的是,Tkinter似乎没有太多的bug,而且大多数已经存在的bug都可以编程。它很结实。它有时会因为没有本地小部件和没有以某种方式呈现字体而受到批评,但却不听人们的话。这些小部件很好,不管它们是否是本地的,字体看起来也很棒。如果字体有问题,我想他们已经解决了。如果我错了,告诉我。我的看起来很完美(和LibreOffice一模一样,如果不是更好的话)。此外,Tkinter的好处也不容忽视。特金特太棒了
Python的help()方法将是您的朋友。在类和模块上使用它
Tkinter最好的一点是它几乎与Python一起提供。因此,与WxPython(甚至不在3.x上,尽管他们正在用另一个名字为它制作一些东西)不同,Tkinter很可能会自动支持Python的所有未来版本(直到他们决定用其他东西替换它,我不知道他们会这样做,除非他们发现一些非常棒的东西)。另外,下载量也不是很大
无论如何,要开始学习,您需要了解标记(尤其是内置标记)和标记。你可能会在很多事情上使用这些。这些对于访问小部件中的特定文本区域并对其进行操作非常重要
INSERT
是一个字符串,'INSERT'
。但是,这也是一个标志。标记是标记位置的可变索引。'insert'
标记表示文本小部件中插入文本的索引。文档的开头是索引“1.0”
,而不是“0.0”
<代码>1是第1行<代码>0是字符0。我不相信一开始就有什么标志。你只需要使用索引。结尾的标记是end(这是一个字符串,'end'
)。'sel.first'和sel.last'表示所选文本开头和结尾处的索引SEL
(或'SEL'
)是一个标记。标记有点像HTML标记,因为它们标记事物的开始和结束(以及其间的所有文本)。您可以创建自己的标记来添加文本样式(如粗体和斜体,或仅突出显示,这对于语法突出显示很有用)。您可以检查一系列文本,看看它是否有特定的标记。比如说,
SEL in self.myTextWidget.tag_names(INSERT)
如果选择了插入文本后的字符(即at),将返回True
对于标记,您可以使用一些方便的符号来获得一些方便的索引位置。例如,“insert wordstart”
将为您提供“insert”
标记所在的任何单词的开头索引<代码>“插入+2c”将在插入后为您提供两个字符的位置。不管怎样,有很多这样的东西
如果您正在制作一个跨平台的应用程序,那么您需要知道一些事件在不同的平台上是不同的。所以,检查并确保它们都能正常工作
你也会想认识到这一点
…
#We're doing both a and A to make sure it works properly when caps-lock is on.
#Control-Shift-a is different from Control-A despite how it may seem.
self.myTextWidget.bind("<Control-a>", self.select_all)
self.myTextWidget.bind("<Control-A>", self.select_all)
def select_all(self, event):
self.myTextWidget.tag_add("sel", "1.0", "end-1c") #END actually goes beyond the end of the text, adding a new line (so, I subtract a character).
return "break" #If you want to override the default binding, you need to return "break"
from Tkinter import *
import tkFileDialog
class Files(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.parent.title("File dialog")
self.pack(fill=BOTH, expand=1)
menubar = Menu(self.parent)
self.parent.config(menu=menubar)
fileMenu = Menu(menubar)
fileMenu.add_command(label="Save", command = self.save_command)
fileMenu.add_command(label="Open", command = self.onOpen)
menubar.add_cascade(label="File", menu=fileMenu)
self.txt = Text(self)
self.txt.pack(fill=BOTH, expand=1)
def onOpen(self):
ftypes = [('Python files', '*.py'), ('All files', '*')]
dlg = tkFileDialog.Open(self, filetypes = ftypes)
fl = dlg.show()
if fl != '':
text = self.readFile(fl)
self.txt.insert(END, text)
def readFile(self, filename):
f = open(filename, "r")
text = f.read()
return text
def save_command(self):
file = tkFileDialog.asksaveasfile(mode='w')
if file != None:
data = self.txt.get('1.0', END+'-1c')
file.write(data)
file.close()
root = Tk()
top = Frame(root)
top.pack(fill=BOTH, expand=1)
def build():
l = Label(top, text="test phrase")
l.pack(side="left")
ent = Entry(top)
ent.pack(side="left")
bottom = Frame(root)
bottom.pack()
ex = Files(root)
ex.pack(side="bottom")
root.geometry("300x250+300+300")
root.mainloop()