我正在使用Python Tkinter,而且我希望onchange从其他工具包/语言中获得相当于的事件.我希望每当用户更新某些小部件的状态时运行代码.
就我而言,我有很多Entry,Checkbutton,Spinbox和Radiobutton小部件.每当这些更改中的任何一个,我想运行我的代码(在这种情况下,更新另一个面板上的文本框).
(只需记住用户可以使用鼠标或键盘与这些小部件进行交互,甚至使用Ctrl + V粘贴文本)
是否可以使用tk创建text editor可以支持的内容syntax highlighting,autocomplete甚至可以在以后扩展IDE为特定语言?
我找到了tkinterwidget,但不确定它是否可以支持?
我认为如果一个小部件可以在用户编写文本时对文本进行一些处理,那么它可以用于此目的.
我想为我的文本编辑器创建行号,但这有点复杂:Tkinter将行号添加到文本小部件
所以我决定创建一个行和列计数器,就像在IDLE. 为了实现这个目标,我决定监听小部件<Key>上生成的事件tkinter.Text。我不知道事件对象有哪些属性,所以我决定查看该类的源代码Event(最好的教程之一:D),我发现有两个主要属性对我来说很有趣目标,即keycode和char。
我的问题是,这个keycodes平台是独立的吗?我希望我的文本编辑器可以在所有平台上工作,而不会出现未定义的行为,因为keycodes.
这是我想做的一个简单实用的功能示例:
from tkinter import *
lines = 1
columns = 0
ARROWS = (8320768, 8124162, 8255233, 8189699)
def on_key_pressed(event=None):
global columns, lines
if event.keycode == 3342463: # return
if columns > 0 and lines > 0:
columns -= 1
if columns < 0: # decrease lines if columns < 0
columns = 0
lines -= 1
if …Run Code Online (Sandbox Code Playgroud) 使用Python 3.3平台独立于此问题.
对于Entry窗口小部件,您可以将变量绑定到此窗口小部件的文本内容,如下所示(请注意构造函数中的textvariable参数Entry):
var = tkinter.StringVar()
entryField = tkinter.Entry(master, textvariable=var)
e.pack()
var.set("a new value") # entryField text now updated with this value
s = var.get() # whatever text now appears in entryField
Run Code Online (Sandbox Code Playgroud)
Text然而,对于小部件,没有这样的变量绑定功能.Text如果感兴趣的话,类定义应该可以从%python dir%/ Lib/tkinter/__ init__.py中的第2927行开始,适用于Windows版本中的Python 3.3.
如何使用Text窗口小部件最好地模拟此变量绑定功能?我的想法是将一个小部件绑定tkinter.StringVar到一个Text小部件,然后获取/设置所有文本.
我最终继承tkinter.Frame作为一个Text包装器,它接受一个textvariable期望作为tkinter.Variable实例的构造函数参数.我下面的例子中我唯一没有继承的Text原因只是因为我也想要一个滚动条,但这并不重要.
以下是我的实验代码.为了与我原来的问题以及问题如何解决(?)完全相关,重要的是self.textvariable.get = self.GetText和self.textvariable.set = self.SetText.基本上,我正在覆盖传入tkinter.Variable对象的get和set方法到我自己的设备......
class TextExtension( tkinter.Frame ): …Run Code Online (Sandbox Code Playgroud) 我最近阅读了受人尊敬的 Bryan Oakley( Tkinter 添加行号到文本小部件)撰写的答案,其中他展示了有关解决问题的示例代码。
当我尝试处理该代码时,它工作正常,直到我复制或粘贴某些内容,即按Ctrl+C或Ctrl+V。它关闭了 tkinter 窗口并出现以下错误:
_tkinter.TclError: text doesn't contain any characters tagged with "sel"
这是代码:
import tkinter as tk
class TextLineNumbers(tk.Canvas):
def __init__(self, *args, **kwargs):
tk.Canvas.__init__(self, *args, **kwargs)
self.textwidget = None
def attach(self, text_widget):
self.textwidget = text_widget
def redraw(self, *args):
'''redraw line numbers'''
self.delete("all")
i = self.textwidget.index("@0,0")
while True :
dline= self.textwidget.dlineinfo(i)
if dline is None: break
y = dline[1]
linenum = str(i).split(".")[0]
self.create_text(2,y,anchor="nw", text=linenum)
i = self.textwidget.index("%s+1line" % i)
class CustomText(tk.Text): …Run Code Online (Sandbox Code Playgroud) 我按照 Bryan Oakley 的代码在此处向文本小部件添加行号功能。我正在该文本框中插入我自己的 XML 文件。该文件列出如下:
myFile.xml
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<p1:sample1 xmlns:p1="http://www.example.org/eHorizon">
<p1:time nTimestamp="5">
<p1:location hours = "1" path = '1'>
<p1:feature color="6" type="a">560</p1:feature>
<p1:feature color="2" type="a">564</p1:feature>
<p1:feature color="3" type="b">570</p1:feature>
<p1:feature color="4" type="c">570</p1:feature>
</p1:location>
</p1:time>
<p1:time nTimestamp="6">
<p1:location hours = "1" path = '1'>
<p1:feature color="2" type="a">564</p1:feature>
<p1:feature color="3" type="b">570</p1:feature>
<p1:feature color="4" type="c">570</p1:feature>
</p1:location>
</p1:time>
</p1:sample1>
Run Code Online (Sandbox Code Playgroud)
myCode.py
import Tkinter as tk
class TextLineNumbers(tk.Canvas):
def __init__(self, *args, **kwargs):
tk.Canvas.__init__(self, *args, **kwargs)
self.textwidget = None
def attach(self, text_widget): …Run Code Online (Sandbox Code Playgroud) 每次用户通过箭头,鼠标点击等更改插入点时,我都需要执行快速检查...所以我这样绑定它:
text.bind("<Button-1>", insertchanged)
def insertchanged(event):
pos=text.index(INSERT)
n=text.tag_names(INSERT)
...
Run Code Online (Sandbox Code Playgroud)
但我发现在用户改变之前 pos仍然是位置!如何找到新职位(一般解决方案,如果可能的话:我必须将其绑定到home,end,pgup,pgdown,...)
谢谢!