选择从ttk.Entry移动到tkinter.Text

时间:2015-11-01 20:35:12

标签: python tkinter ttk

这是一个困扰我的python / tkinter程序。该窗口显示一个只读的ttk.Entry和一个被禁用的tkinter.Text。它以编程方式在“条目”框中选择一个字符,并且永远不会更改此选择。但是,如果我尝试在 other 框中选择文本(disabledText),则选择将会改变。这看起来不对。

OS X上的Python 3.5.0和tcl / tk 8.5.18

  1. 运行程序时,您可以看到" A"在条目(上方)框中突出显示。
  2. 推送"写数据"按钮几次; print语句将显示" A"在“输入”框中选择了该选项。
  3. 将鼠标扫过文本(下方)框中的某些文本;它不会被突出显示,但条目中的突出显示将消失。
  4. 推送"写数据"按钮; print语句将显示您用鼠标扫描的字符。
  5. 这些角色来自Entry上的selection_get()!你可以告诉它从Text获取它们,因为这两个盒子没有共同的字符。
  6. 如果有人能够解释这一点,我将非常感激。

    import tkinter
    from tkinter import ttk
    
    class ButtonPanel(ttk.Frame):
        def __init__(self, parent):
            super().__init__(parent)
            self.data = ttk.Entry(self, width=27, takefocus=False)
            self.data.insert(0, "ABCDEFG")
            self.data.select_range(0, 1)                            # select the "A"
            self.data.state(["readonly"])
            self.data.bind('<ButtonPress>', lambda e: 'break')      # ignore mouse clicks
            button = ttk.Button(self, text="Write Data", command=self.master.write)
            self.data.grid(column=0, row=0, padx=10)
            button.grid(column=1, row=0, padx=10)
    
        def get(self):
            return self.data.selection_get()                 # should always be the "A"
    
    class App(ttk.Frame):
        def __init__(self, parent):
            super().__init__(parent)
            self.bp = ButtonPanel(self)
            self.display = tkinter.Text(self, width=50, height=10, wrap="char", takefocus="False")
            self.display.insert('end', "HIJKLMNOPQRSTUV")
            self.display.config(state="disabled")
            self.bp.pack()
            self.display.pack()
    
        def write(self):
            char = self.bp.get()                # should always be the "A"
            print("this should be just one character: ->{}<-".format(char))
    
    if __name__ == "__main__":
        root = tkinter.Tk()
        root.title("What's up here?")
        App(root).pack()
        root.mainloop()
    

1 个答案:

答案 0 :(得分:1)

您正在观察的是默认行为。这两个小部件(以及列表框)都有一个名为exportselection的属性,默认值为True。当True时,窗口小部件会将选择内容导出为主要选择。在旧的unix系统上(tcl / tk和tkinter开始),你一次只能选择一个“主要”。

简单的解决方案是将此选项设置为文本窗口小部件的False。这将允许您的应用程序一次选择多个项目,但只有条目小部件将选择导出到剪贴板(这是selection_get工作所必需的。

...
self.display = tkinter.Text(self, ..., exportselection=False)
...

另一个问题是,在OSX上,选择不会显示已禁用的文本小部件。正在选择文本 ,您无法看到它。更准确地说,除非窗口小部件具有焦点,否则将不会显示选择,并且默认情况下,单击它时不会给予焦点。