如何在函数内部时从 tkinter 文本小部件获取输入
how to get input from a tkinter text widget when its inside a function
编码相对较新,目前我正在 python 中使用 tkinter,我在函数中使用文本小部件并希望将文本框中的输入发送到另一个函数。我的全局变量在模块级别说未定义,所以如果它在函数内,我如何才能在模块级别定义它?
当我按下发送电子邮件按钮时,我收到此错误消息 "NameError: name 'user_message_entry' is not defined"
有什么建议吗?非常感谢!
最小复制:
import tkinter as tk
root = tk.Tk()
root.geometry("500x500")
def send_email():
global user_message_entry
subject = ":)"
body = user_message_entry.get("1.0", "end")
message = f"subject: {subject}\n\n {body}"
print(message)
def feedback():
feedback_window = tk.Toplevel()
feedback_window.geometry("690x650")
message_frame = tk.Frame(feedback_window)
message_frame.grid(row=0, column=0, columnspan=3)
user_message_entry = tk.Text(message_frame, height=10, width=60)
user_message_entry.grid(row=0, column=0)
send_email_button = tk.Button(feedback_window, command=send_email,
height=20, width=20, bg="yellow", text="send email")
send_email_button.grid(row=1, column=0)
open_feedback_button = tk.Button(root, command=feedback, height=20, width=20, bg="yellow", text="open feedback window")
open_feedback_button.grid(row=1, column=0)
root.mainloop()
您可以使用面向对象的方法来简化访问,另一种选择是您可以使用 globals() 来使变量全局化
单向
globals()['user_message_entry'] = tk.Text(message_frame, height=10, width=60)
....
并且您可以从另一个函数调用
body = globals()['user_message_entry'].get("1.0", "end")
第二种方式
面向对象编程适用于解决各种类型的问题,因此您也可以使用 class
import tkinter as tk
class CBased:
def __init__(self, master, *args, **kwargs):
super(CBased, self).__init__(*args, *kwargs)
self.master = master
master.geometry("500x500")
self.open_feedback_button = tk.Button(master, command=self.feedback, height=20, width=20, bg="yellow", text="open feedback window")
self.open_feedback_button.grid(row=1, column=0)
def send_email(self):
subject = ":)"
body = self.user_message_entry.get("1.0", "end")
message = f"subject: {subject}\n\n {body}"
print(message)
def feedback(self):
self.feedback_window = tk.Toplevel()
self.feedback_window.geometry("690x650")
self.message_frame = tk.Frame(self.feedback_window)
self.message_frame.grid(row=0, column=0, columnspan=3)
self.user_message_entry = tk.Text(self.message_frame, height=10, width=60)
self.user_message_entry.grid(row=0, column=0)
self.send_email_button = tk.Button(self.feedback_window, command=send_email,
height=20, width=20, bg="yellow", text="send email")
self.send_email_button.grid(row=1, column=0)
def main():
root = Tk()
myobj = CBased(root)
root.mainloop()
if __name__ == "__main__":main()
通过这种方式,您可以通过 self.xyz
调用每个项目
编码相对较新,目前我正在 python 中使用 tkinter,我在函数中使用文本小部件并希望将文本框中的输入发送到另一个函数。我的全局变量在模块级别说未定义,所以如果它在函数内,我如何才能在模块级别定义它?
当我按下发送电子邮件按钮时,我收到此错误消息 "NameError: name 'user_message_entry' is not defined"
有什么建议吗?非常感谢!
最小复制:
import tkinter as tk
root = tk.Tk()
root.geometry("500x500")
def send_email():
global user_message_entry
subject = ":)"
body = user_message_entry.get("1.0", "end")
message = f"subject: {subject}\n\n {body}"
print(message)
def feedback():
feedback_window = tk.Toplevel()
feedback_window.geometry("690x650")
message_frame = tk.Frame(feedback_window)
message_frame.grid(row=0, column=0, columnspan=3)
user_message_entry = tk.Text(message_frame, height=10, width=60)
user_message_entry.grid(row=0, column=0)
send_email_button = tk.Button(feedback_window, command=send_email,
height=20, width=20, bg="yellow", text="send email")
send_email_button.grid(row=1, column=0)
open_feedback_button = tk.Button(root, command=feedback, height=20, width=20, bg="yellow", text="open feedback window")
open_feedback_button.grid(row=1, column=0)
root.mainloop()
您可以使用面向对象的方法来简化访问,另一种选择是您可以使用 globals() 来使变量全局化
单向
globals()['user_message_entry'] = tk.Text(message_frame, height=10, width=60)
....
并且您可以从另一个函数调用
body = globals()['user_message_entry'].get("1.0", "end")
第二种方式
面向对象编程适用于解决各种类型的问题,因此您也可以使用 class
import tkinter as tk
class CBased:
def __init__(self, master, *args, **kwargs):
super(CBased, self).__init__(*args, *kwargs)
self.master = master
master.geometry("500x500")
self.open_feedback_button = tk.Button(master, command=self.feedback, height=20, width=20, bg="yellow", text="open feedback window")
self.open_feedback_button.grid(row=1, column=0)
def send_email(self):
subject = ":)"
body = self.user_message_entry.get("1.0", "end")
message = f"subject: {subject}\n\n {body}"
print(message)
def feedback(self):
self.feedback_window = tk.Toplevel()
self.feedback_window.geometry("690x650")
self.message_frame = tk.Frame(self.feedback_window)
self.message_frame.grid(row=0, column=0, columnspan=3)
self.user_message_entry = tk.Text(self.message_frame, height=10, width=60)
self.user_message_entry.grid(row=0, column=0)
self.send_email_button = tk.Button(self.feedback_window, command=send_email,
height=20, width=20, bg="yellow", text="send email")
self.send_email_button.grid(row=1, column=0)
def main():
root = Tk()
myobj = CBased(root)
root.mainloop()
if __name__ == "__main__":main()
通过这种方式,您可以通过 self.xyz
调用每个项目