![](/img/trans.png)
[英]tkinter: inserting button in a text box next to text in each line dynamically
[英]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.