如何禁用在Python / Tk程序中选择文本?

时间:2014-10-06 00:38:33

标签: python user-interface text tkinter

怎么做? 我无法在这里或谷歌找到它。

#Refrences
from tkinter import *

class Interface:

    def __init__(self,stage):

        topLeft = Frame(stage,bg='black')
        test = Entry(topLeft,bg='#2a2a2a',fg='white',insertontime=0)
        test.config(insertbackground='white', exportselection=0)
        test.grid()
        topLeft.grid(row=0,column=0)

def launch():
    window = Tk()
    lobby = Interface(window)
    window.mainloop()

launch()

4 个答案:

答案 0 :(得分:0)

我假设您希望用户无法编辑条目框?如果是这样,您必须使用(state =“disabled”)的config参数,例如

test.config(insertbackground='white', exportselection=0, state="disabled")
但是要小心,我找不到办法让你的输入框的背景变黑。希望这有帮助

答案 1 :(得分:0)

当我们选择一个文本时,我们将tkinter触发(触发)3个事件,即ButtonPress,Motion和ButtonRelease,所有这3个事件都调用事件处理程序fucntion。 该函数运行select_range(start,end)方法,该方法突出显示所选文本。

要禁用此功能,我们必须将ButtonPress和Motion事件放在一起,并在窗口小部件上调用select_clear方法。

如果你处理事件并调用select_clear方法它可以工作但不正确,文本将突出显示,当发生另一个事件时,将清除高亮颜色。 这是因为事件的执行顺序而发生的。这意味着你必须告诉tk在默认事件处理程序之后处理你的事件。我们可以使用bindtags和bin_class方法更改事件执行的顺序

例如:

from tkinter import *
from tkinter import ttk


def on_select(event):
    event.widget.select_clear()  # clear selected text.


root = Tk()

name_entry = ttk.Entry(root)
name_entry.pack()

# with PostEvent tag, on_select the event hanlde after default event handler
name_entry.bindtags((str(name_entry), "TEntry", "PostEvent", ".", "all"))
name_entry.bind_class("PostEvent", "<ButtonPress-1><Motion>", on_select)


root.mainloop()

答案 2 :(得分:0)

您可以设置文本突出显示颜色以匹配条目窗口小部件的背景。请注意,仍可以选择窗口小部件中的文本,但用户将看不到它,这会给人一种幻想,即已禁用选择。

test = Entry(topLeft,bg='#2a2a2a',fg='white',insertontime=0)
test.configure(selectbackground=test.cget('bg'), inactiveselectbackground=test.cget('bg'))

答案 3 :(得分:-1)

Tkinter没有大量内置小部件的有用解决方案(例如,JavaFX会这样做),如果你不介意它们不是你想要的那么你就可以轻松制作自己的小组件:)这里是一个粗略的边缘示例,使用画布来模拟无法选择的输入字段。我给出的只是插入功能(如果你对它很聪明,我想也会删除),但你可能想要更多。 (另一个优点是,因为它是一个画布项目,你可以使用它进行漂亮的格式化。)

我是否正确,通过一个不可选的条目小部件,你的意思是一个写有文字的画布?如果要在所有窗口小部件(包括顶级框架)中禁用文本突出显示,可以高举Button-1事件,取消选择所有内容,然后在选择文本时使用该事件。

from tkinter import *

class NewEntry(Canvas):

    def __init__( self, master, width, height ):
        Canvas.__init__( self, master, width=width,height=height )
        self.width = width
        self.height = height
        self.text = ''

    def insert( self, index, text ):
        self.text =''.join([self.text[i] for i in range(index)] + [text] + [self.text[i] for i in range(index,len(self.text))])
        self.delete(ALL)
        self.create_text(self.width//2,self.height//2,text=self.text)

root = Tk()
entry = NewEntry(root,100,100)
entry.insert(0,'hello world')
entry.insert(5,'world')
entry.pack()
root.mainloop()