tkinter中的不可移动文本

时间:2011-10-11 11:04:21

标签: python text tkinter tk

这里有一些代码:

from Tkinter import *

class Main(object):

    def __init__(self):
        self.console = Text(root, relief='groove', cursor='arrow', spacing1=3)
        self.console.insert(INSERT, '>>> ')
        self.console.focus_set()
        self.scroll = Scrollbar(root, cursor='arrow', command=self.console.yview)
        self.console.configure(yscrollcommand=self.scroll.set)

        self.scroll.pack(fill='y', side='right')
        self.console.pack(expand=True, fill='both')

root = Tk()
root.geometry('%sx%s+%s+%s' %(660, 400, 40, 40))
root.option_add('*font', ('Courier', 9, 'bold'))
root.resizable(0, 1)
app = Main()
root.mainloop()

有什么方法可以制作'>>> '变得无法移动(例如在IDLE中)? 提前谢谢。

3 个答案:

答案 0 :(得分:3)

看看IDLE的源代码。特别要看EditorWindow.py中的'smart_backspace_event'。 IDLE将文本小部件上的<Key-Backspace>绑定到此函数(间接通过<<smart-backspace>>事件)。

您需要的基本代码如下:

chars = console.get("insert linestart", "insert")
# [Do some analysis on "chars" to detect >>> and prevent a backspace]

if DO_BACKSPACE: 
    console.delete("insert-1c", "insert")

# "break" is important so that the Text widget's backspace handler doesn't get called
return "break"

答案 1 :(得分:2)

没有内置方法可以做到这一点。您将不得不设置一个覆盖默认行为的绑定集合,这不是一件特别容易的事情。但是,这是可能的,因为您可以完全控制所有绑定(即:在小部件中没有行为是硬编码的,无法更改)

另一种更具防弹性的解决方案是截取低级tkinter插入和删除命令,并检查某些条件。例如,请参阅问题https://stackoverflow.com/a/11180132/7432的答案。该答案提供了一个通用的解决方案,可用于提示(如本问题中所要求的),或用于将文本的任何部分标记为只读。

答案 2 :(得分:1)

'&gt;&gt;&gt;' IDLE中显示的是Python解释器输出的一部分。我想您可以尝试收听<Key>个事件并在需要时恢复提示(请参阅http://docs.python.org/library/tkinter.html#bindings-and-eventshttp://effbot.org/tkinterbook/tkinter-events-and-bindings.htm