选择从ttk.Entry移至tkinter.Text

问题描述 投票:0回答:1

这是一个让我感到困惑的python / tkinter程序。该窗口显示为只读的ttk.Entry和禁用的tkinter.Text。它以编程方式在“输入”框中选择一个字符,并且从不更改此选择。但是,如果我尝试在other框中选择文本(disabledText),则选择内容将会更改。这似乎不正确。

OS X上的Python 3.5.0和tcl / tk 8.5.18

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

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

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()
python tkinter ttk
1个回答
1
投票

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

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

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

另一个问题是,在OSX上,禁用的文本窗口小部件不会显示该选择。文本已被选中,您只是看不到它。更准确地说,只有当窗口小部件具有焦点时,该选择才会显示,并且默认情况下,单击它时不会为其提供焦点。

© www.soinside.com 2019 - 2024. All rights reserved.