簡體   English   中英

如何在用戶單擊按鈕后插入新文本之前測試 Tkinter 文本框小部件的當前文本?

[英]How to test the current text of a Tkinter text box widget before inserting new text after user clicks on a button?

我想要做的是在使用 Tkinter 模塊構建的電子郵件表單中附加文件。 它目前適用於一個,但是...如果我想附加多個文件怎么辦?

我創建了一個按鈕,用戶可以在其中瀏覽文件,並將所選文件的路徑寫入文本框中。 這是我遇到問題的地方...如果文本框為空,我不想在文件路徑前插入分號。

.get.index在這種情況下不起作用。 這些線位於何處並不重要。 他們總是返回最終結果而不是當前結果...因此,結果始終為 False(文本框不為空)並將插入分號。

我在某處讀到我需要先綁定它。 我嘗試閱讀有關它的文檔,但沒有相關示例...

問題出在def browse

from tkinter import filedialog, \
    Tk, Label, Button, Text, \
    RIGHT, LEFT, END, W
from os import path


class EmailPopup:
    def __init__(self, from_address=None, recipients=None, subject=None, body=None, salutation=None,
                 password=None, attachment=None):
        self.master = Tk()
        master = self.master

        self.master.title = master.title("Compose New Email")

        self.from_label = Label(master, text="FROM: ")
        self.from_label.pack(anchor=W, padx=4)
        self.from_address_entry = Text(master, height=1, width=75)  # Resist the temptation to combine these lines.
        if from_address:  # They will not work as expected when using get().
            self.from_address_entry.insert(END, from_address)  # <- will error if None (tkinter.TclError)
        self.from_address_entry.pack(anchor=W, padx=4)

        self.to_label = Label(master, text="TO: ")
        self.to_label.pack(anchor=W, padx=4)
        self.recipients_entry = Text(master, height=1, width=75)
        if recipients:
            self.recipients_entry.insert(END, recipients)
        self.recipients_entry.pack(anchor=W, padx=4)

        self.subject_label = Label(master, text="SUBJECT: ")
        self.subject_label.pack(anchor=W, padx=4)
        self.subject_entry = Text(master, height=1, width=75)
        if subject:
            self.subject_entry.insert(END, subject)
        self.subject_entry.pack(anchor=W, padx=4)

        self.body_label = Label(master, text="BODY: ")
        self.body_label.pack(anchor=W, padx=4)
        text = Text(master, height=25, width=75)

        if body:
            text.insert(END, body)
        if salutation:
            text.insert(END, salutation + "\n")

        self.body_entry = text

        self.body_entry.pack(anchor=W, padx=4)

        self.attachment_label = Label(master, text="Attachment: (type full path to file)")
        self.attachment_label.pack(anchor=W, padx=4)
        self.attachment_link = Text(master, height=1, width=75)
        if attachment:
            self.attachment_link.insert(END, path.abspath(attachment))
        self.attachment_link.config(fg='blue')
        self.attachment_link.pack(anchor=W, padx=4)

        Button(master, text='BROWSE FOR FILE', command=self.browse).pack(anchor=W, padx=4)
        Button(master, text='SEND', command=self.send, fg="green").pack(side=LEFT, padx=4, pady=8)
        Button(master, text='CANCEL', command=self.quit, fg="red").pack(side=RIGHT, padx=4)

        self.password = password

        self.from_address_entry.bind("<Tab>", self.callback)
        self.recipients_entry.bind("<Tab>", self.callback)
        self.subject_entry.bind("<Tab>", self.callback)
        self.body_entry.bind("<Tab>", self.callback)
        self.attachment_link.bind("<Tab>", self.callback)

        master.mainloop()

    def callback(self, event):
        event.widget.tk_focusNext().focus()
        return "break"

    def browse(self):

        browser_window = self.master
        browser_window.filename = filedialog.askopenfilename(initialdir="/", title="Select file to attach")
        result = browser_window.filename

# THIS IS WHERE THE ISSUE IS:
        if result:
            if self.attachment_link.index("end") == 0:
                self.attachment_link.insert(END, result)
            else:
                self.attachment_link.insert(END, "; " + result)

            # This isn't working as expected either...
            # if self.attachment_link.get('1.0', 'end') is None:  <--- Getting False even when blank
            #    self.attachment_link.insert(END, result)
            # else:
            #    self.attachment_link.insert(END, ";" + result)

    def quit(self):
        self.master.quit()
        exit(0)

    def send(self):
        self.master.quit()


EmailPopup()

預計.get.index將返回None或空白。 實際結果是它給了我帶有分號"; C:/Google Drive/Processed Jobs/"而不是當前的最終結果。 結果應該是"C:/Google Drive/Processed Jobs/" 所以它完全無序發射並且非常令人困惑。

我認為,從技術上講,您的問題是tkinter的副本- 檢查 Text widget 是否為空,但我無法將其標記為空,因為該問題的 OP 從未接受過答案 - 所以我將重復第一部分@Bryan Oakley 在這里的回答是什么,因為它是正確的(並且應該被接受)。

Tkinter 會自動在小部件中的數據末尾添加換行符。 要查看小部件是否為空,請將換行符之前的索引與起始索引進行比較; 如果它們相同,則小部件為空。

這意味着您可以通過更改代碼的這一部分來做您想做的事:

# THIS IS WHERE THE ISSUE IS:
        if result:
#            if self.attachment_link.index("end") == 0::
            if self.attachment_link.index("end-1c") == '1.0':  # First attachment?
                self.attachment_link.insert(END, result)
            else:
                self.attachment_link.insert(END, '; ' + result)

請注意, Text小部件的index()方法總是這種格式返回一個字符串,這就是為什么檢查它是否等於None或整數0可能永遠不會是正確的做法......

這是我目前的解決方案。 我決定將附件文本框綁定到一個計算鍵的新函數。 然后,如果該數字大於零,程序將添加分號。 如果您能想到更好的方法,請告訴我...


self.attachment_link.bind("<Key>", self.callback_attachments_entry)

        self.key_count = 0


    def callback_attachments_entry(self, event):
        print(repr(event.char))
        if event.char == '\x08' and self.key_count != 0:  # backspace
            self.key_count -= 1
        else:
            self.key_count += 1

    def browse(self):
        browser_window = self.master
        browser_window.filename = filedialog.askopenfilename(initialdir="/", title="Select file to attach")
        result = browser_window.filename
        if result:
            if self.key_count > 0:
                result = "; " + result
            self.attachment_link.insert(END, result)
            self.attachment_link.insert(END, result)
            self.key_count += len(result)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM