Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当tkinter文本小部件位于函数内部时,如何从中获取输入_Python_Python 3.x_Tkinter_Global Variables_Tkinter Text - Fatal编程技术网

Python 当tkinter文本小部件位于函数内部时,如何从中获取输入

Python 当tkinter文本小部件位于函数内部时,如何从中获取输入,python,python-3.x,tkinter,global-variables,tkinter-text,Python,Python 3.x,Tkinter,Global Variables,Tkinter Text,对编码来说比较陌生,目前我正在python中使用tkinter,我在一个函数中使用一个文本小部件,希望将输入从文本框发送到另一个函数。我的全局变量表示未在模块级定义,那么如果它在函数中,我如何在模块级定义它呢 当我按下发送电子邮件按钮时,我收到此错误消息“名称错误:未定义名称‘用户\消息\条目’” 有什么建议吗?非常感谢 最低复制: import tkinter as tk root = tk.Tk() root.geometry("500x500") def send_email():

对编码来说比较陌生,目前我正在python中使用tkinter,我在一个函数中使用一个文本小部件,希望将输入从文本框发送到另一个函数。我的全局变量表示未在模块级定义,那么如果它在函数中,我如何在模块级定义它呢

当我按下发送电子邮件按钮时,我收到此错误消息“名称错误:未定义名称‘用户\消息\条目’”

有什么建议吗?非常感谢

最低复制:

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()

您可以使用面向对象的方法使access成为sympler,另一个选项是您还可以使用globals()使变量成为全局变量

单向

globals()['user_message_entry'] = tk.Text(message_frame, height=10, width=60)

.... 
您可以从另一个函数调用

body = globals()['user_message_entry'].get("1.0", "end")
第二种方式

globals()['user_message_entry'] = tk.Text(message_frame, height=10, width=60)

.... 
面向对象编程适用于各种类型的问题解决,所以您也可以使用类

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

您可以使用面向对象的方法使access成为sympler,另一个选项还可以使用globals()使变量成为全局变量

单向

globals()['user_message_entry'] = tk.Text(message_frame, height=10, width=60)

.... 
您可以从另一个函数调用

body = globals()['user_message_entry'].get("1.0", "end")
第二种方式

globals()['user_message_entry'] = tk.Text(message_frame, height=10, width=60)

.... 
面向对象编程适用于各种类型的问题解决,所以您也可以使用类

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()

通过这种方式,您可以自行调用每一项。xyz

您应该将行
全局用户消息项
移动到
反馈()
@acw1668这可以工作,但
全局用户消息项
在模块级别仍然表示未定义。如何排序?那么您最好将输入值作为参数传递给
send\u-mail()
。很抱歉,您可以对此进行扩展吗?将
def send\u-mail()
更改为
def send\u-mail(输入)
。然后
send\u email\u button=tk.button(…,command=lambda:send\u email(user\u message\u entry),…)
。您应该将行
global user\u message\u entry
移动到
feedback()
@acw1668这可以工作,但是
global user\u message\u entry
在模块级仍然表示未定义。如何排序?那么您最好将输入值作为参数传递给
send\u-mail()
。很抱歉,您可以对此进行扩展吗?将
def send\u-mail()
更改为
def send\u-mail(输入)
。然后
send\u email\u button=tk.button(…,command=lambda:send\u email(user\u message\u entry),…)
。非常感谢,非常有用!是的,过了一段时间,我认为如果我从一开始就使用类是最好的,但是现在有太多的改变:P还要添加到窗口中,我只需要
globals()['user\u message\u entry'].grid(row=0,column=0)
,这是正确的吗?如果它能满足您的需求,您可以使用它。祝你快乐!那么我们有没有办法缩短globals()['user\u message\u entry']]。。。当我们在其他地方使用它时,例如滚动条?除了通过面向对象的maner在类中具有可行性之外,没有其他方法。像self.e1=…,你可以使用self.e1千次表示无限时间非常感谢,非常有用!是的,过了一段时间,我认为如果我从一开始就使用类是最好的,但是现在有太多的改变:P还要添加到窗口中,我只需要
globals()['user\u message\u entry'].grid(row=0,column=0)
,这是正确的吗?如果它能满足您的需求,您可以使用它。祝你快乐!那么我们有没有办法缩短globals()['user\u message\u entry']]。。。当我们在其他地方使用它时,例如滚动条?除了通过面向对象的maner在类中具有可行性之外,没有其他方法。比如self.e1=…,你可以用self.e1千次表示无限时间