繁体   English   中英

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

[英]selection moves from ttk.Entry to tkinter.Text

这是一个让我困惑的 python/tkinter 程序。 该窗口显示只读的 ttk.Entry 和禁用的 tkinter.Text。 它以编程方式在输入框中选择一个字符,并且永远不会更改此选择。 box (the disabledText).但是,如果我尝试在框(disabledText)中选择文本,则选择会改变。 这似乎不对。

OS X 上的 Python 3.5.0 和 tcl/tk 8.5.18

  1. 当您运行程序时,您可以看到“条目”(上)框中突出显示的“A”。
  2. 按几次“写入数据”按钮; 打印语句将显示在输入框中选择的“A”。
  3. 将鼠标滑过文本(下方)框中的一些文本; 它不会突出显示,但条目中的突出显示将消失。
  4. 按下“写入数据”按钮; 打印语句将显示您用鼠标扫过的字符。
  5. 这些字符来自 Entry 上的 selection_get()! 您可以看出它是从 Text 中获取的,因为这两个框没有共同的字符。

如果有人可以解释这一点,我将不胜感激。

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()

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

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

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

另一个问题是,在 OSX 上,对于禁用的文本小部件,选择不会显示。 文本正在被选中,你只是看不到它。 更准确地说,除非小部件具有焦点,否则不会显示选择,并且默认情况下,单击它时不会获得焦点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM