如何 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 list
或 dict
,也可以是更复杂的 data class
由 callback
,并变异为它分配适当的值。
这是一个使用字典的非常简单的例子:
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 方法。
我用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 list
或 dict
,也可以是更复杂的 data class
由 callback
,并变异为它分配适当的值。
这是一个使用字典的非常简单的例子:
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 方法。