Python 在用户单击按钮后插入新文本之前,如何测试Tkinter文本框小部件的当前文本?

Python 在用户单击按钮后插入新文本之前,如何测试Tkinter文本框小部件的当前文本?,python,tkinter,binding,insert,Python,Tkinter,Binding,Insert,我试图做的是在使用Tkinter模块构建的电子邮件表单中附加文件。它目前可以用一个,但是。。。 如果要附加多个文件,该怎么办 我创建了一个按钮,用户可以在其中浏览文件,并将所选文件的路径写入文本框。 这是我遇到问题的地方。。。 如果文本框为空,我不想在文件路径前插入分号 .get和.index在这种情况下不起作用。这些线路位于何处并不重要。他们总是返回最终结果而不是当前结果。。。因此,结果始终为False(文本框不是空的),并将插入分号 我在某个地方读到,我需要先把它绑起来。我试着阅读文档,但没

我试图做的是在使用Tkinter模块构建的电子邮件表单中附加文件。它目前可以用一个,但是。。。 如果要附加多个文件,该怎么办

我创建了一个按钮,用户可以在其中浏览文件,并将所选文件的路径写入文本框。 这是我遇到问题的地方。。。 如果文本框为空,我不想在文件路径前插入分号

.get
.index
在这种情况下不起作用。这些线路位于何处并不重要。他们总是返回最终结果而不是当前结果。。。因此,结果始终为False(文本框不是空的),并将插入分号

我在某个地方读到,我需要先把它绑起来。我试着阅读文档,但没有相关的例子

问题在def browse
def中

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()
从tkinter导入文件对话框\
Tk、标签、按钮、文本、\
右,左,结束,W
从操作系统导入路径
类电子邮件弹出窗口:
定义初始化(self,from_address=None,recipients=None,subject=None,body=None,称呼=None,
密码=无,附件=无):
self.master=Tk()
主人
self.master.title=master.title(“撰写新电子邮件”)
self.from_label=标签(主控,text=“from:”)
自贴标签包装(锚定=W,padx=4)
self.from_address_entry=Text(master,高度=1,宽度=75)#抵制组合这些行的诱惑。
if from_address:#当使用get()时,它们将无法按预期工作。

self.from_address_entry.insert(END,from_address)#这是我当前的解决方案。我决定将附件文本框绑定到一个新函数,该函数计算键数。然后,如果该数字大于零,程序将添加分号。如果你能想出一个更好的方法,那么请让我知道


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)

self.attachment\u link.bind(“,self.callback\u attachments\u条目)
self.key\u计数=0
def回调_附件_条目(自身、事件):
打印(repr(event.char))
如果event.char='\x08'和self.key\u count!=0:#退格
self.key_count-=1
其他:
self.key_count+=1
def浏览(自我):
浏览器\窗口=self.master
browser_window.filename=filedialog.askopenfilename(initialdir=“/”,title=“选择要附加的文件”)
结果=browser\u window.filename
如果结果为:
如果self.key_计数>0:
result=“;”+结果
self.attachment\u link.insert(结束,结果)
self.attachment\u link.insert(结束,结果)
self.key\u count+=len(结果)

我认为,从技术上讲,你的问题是重复的,但我不能将其标记为重复的,因为该问题的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\u link.index(“end”)
永远不会返回
0
,因此
else
子句总是执行。
get(…)
永远不会返回
None
。您需要检查是否有空字符串。@martineau您现在应该可以运行我的代码了。它会试图寻找一些你电脑上不存在的图片,然后出错。我把它缩减为只需要的内容。@Bryan:它永远不会返回
,但将它与空字符串进行比较并不是一个解决方案,因为当文本小部件为空时,它也不会返回空字符串(它返回
“2.0”
)。我喜欢它通过更改一行来实现我想要的效果。这比数钥匙要简单得多。。。谢谢。@Austin:是的,这样的结果很好。注意:如果self.attachment\u link.index(“end”)=“2.0”,您也可以使用
,因为“空”文本的结尾也是第二行的开始(因为自动添加了换行符)。