如何 return 在 tkinter 中作为命令给出的函数值

How to return a value of a function given as a command in tkinter

我用pythontkinter写了一个非常简单的代码,它包含一个输入框。我想把用户输入的值留给自己,以备后用。

代码如下:

import tkinter as tk 
   
root=tk.Tk() 
  
root.geometry("600x400") 
   
def submit(): 
  
    name=name_entry.get() 
    return name
       
name_label = tk.Label(root, text = 'Username', 
                      font=('calibre', 
                            10, 'bold')) 
    
name_entry = tk.Entry(root, 
                      font=('calibre',10,'normal')) 
     
sub_btn=tk.Button(root,text = 'Submit', 
                  command = submit) 

name_label.grid(row=0,column=0) 
name_entry.grid(row=0,column=1)  
sub_btn.grid(row=2,column=1) 

root.mainloop() 

在函数submit中我写了return name,以便return插入的用户名。但是我怎样才能在函数之外访问它呢?我想把值保存在某个地方,但我不知道该怎么做。

感谢您提前提供的帮助

我建议使用 OOP 方法,让对象保持状态:

import tkinter as tk


class Program:
    def __init__(self):
        self.root = tk.Tk()
        self.name_label = tk.Label(self.root, text='Username',
                                   font=('calibre', 10, 'bold'))
        self.name_entry = tk.Entry(self.root, font=('calibre', 10, 'normal'))
        self.sub_btn = tk.Button(self.root, text='Submit', command=self.submit)
        self.submitted_var = tk.StringVar()

        self.submitted_label = tk.Label(self.root, text="Submitted name: ")
        self.submitted_entry = tk.Label(self.root, textvariable=self.submitted_var)

    def setup(self):
        self.submitted_label.grid(row=0, column=0)
        self.submitted_entry.grid(row=0, column=1)
        self.name_label.grid(row=1, column=0)
        self.name_entry.grid(row=1, column=1)
        self.sub_btn.grid(row=2, column=1)

    def submit(self):
        self.submitted_var.set(self.name_entry.get())

    def run(self):
        self.setup()
        self.root.mainloop()

if __name__ == '__main__':
    Program().run()

然后你可以在任何地方使用self.submitted_var.get()来获取最后提交的值。虽然,更 straight-forward 的方式是 link 一个 StringVar 直接到 name_entry,但是每次 Entry 小部件值更改时它都会更改,渲染提交按钮没用。

大多数时候,回调会删除 return 值(所有 tkinter 回调都会这样做),如果有的话。这是因为使用最常用于回调的观察者模式来管理 return 值有点尴尬。

有两种主要方法可以将值从 CB 传输到需要的地方:

一种是使用 container object - 可以是简单的 python listdict,也可以是更复杂的 data classcallback,并变异为它分配适当的值。

这是一个使用字典的非常简单的例子:

import tkinter as tk 

def print_info():
    print(f'from print_info: {information_transfer}')

def submit(): 
    information_transfer['name'] = name_entry.get() 
    print(f'after input: {information_transfer}')
       
root=tk.Tk()   
root.geometry("600x400") 
   
name_label = tk.Label(root, text = 'Username', font=('calibre', 10, 'bold')) 
name_entry = tk.Entry(root, font=('calibre', 10, 'normal')) 
     
sub_btn = tk.Button(root,text='Submit', command=submit)
info_btn = tk.Button(root,text='print info', command=print_info)


name_label.grid(row=0, column=0) 
name_entry.grid(row=0, column=1)  
sub_btn.grid(row=2, column=1) 
info_btn.grid(row=3, column=1) 

information_transfer = {'name': None, 'other': None}
print(f'before input: {information_transfer}')

root.mainloop()

另一个是@DavidGildour 在另一个答案中描述的 OOP 方法。