簡體   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