Python 你能从tk.OptionMenu';s命令参数,而不传递参数
我想检查用户是否更改了tkinter小部件中的任何值,然后提示保存这些值或丢失更改 许多应用程序在其设置框的右下角有3个按钮,Python 你能从tk.OptionMenu';s命令参数,而不传递参数,python,tkinter,Python,Tkinter,我想检查用户是否更改了tkinter小部件中的任何值,然后提示保存这些值或丢失更改 许多应用程序在其设置框的右下角有3个按钮,OK、Cancel和Apply,其中Apply被禁用,直到做出更改。我在我的程序中模仿这个功能 当我使用tk.OptionMenu(command=function)时,默认情况下,它会将当前用户选择发送到函数,但是我不需要知道当前选择,因为无论是什么,我都希望提示用户保存设置 运行该程序将导致以下错误: TypeError:函数()接受0个位置参数,但给出了1个 我想到
OK
、Cancel
和Apply
,其中Apply
被禁用,直到做出更改。我在我的程序中模仿这个功能
当我使用tk.OptionMenu(command=function)
时,默认情况下,它会将当前用户选择发送到函数,但是我不需要知道当前选择,因为无论是什么,我都希望提示用户保存设置
运行该程序将导致以下错误:
TypeError:函数()接受0个位置参数,但给出了1个
我想到的一个简单解决方法是为function()
提供一个任意参数,如下所示:
def function(param=None):
value_change.status = True
有关值的更改。状态
用法,请参见示例代码
然而,PyCharm指出,未使用param
,并将其标记为弱警告。我对传递的值没有任何用处,因此除了忽略它和PyCharm警告之外,我不能对param
做很多事情。从技术上讲,这里没有问题,但我喜欢看到屏幕右上角的绿色复选标记,因此我想出了另一个解决方法:
def function(param=None):
value_change.status = True if param else False
param=None
和if-param-else-False
都是多余的,因为它们只是占位符,可以使代码平稳运行,而不会引发任何警告
另一个问题是,当我想将function()
用于不传递参数的其他小部件命令时,例如tk.Checkbutton(command=function)
,我必须将代码更改为以下行,这使得代码看起来比以前更加冗余
def function(param=True):
value_change.status = True if param else False
有没有办法不通过tk.OptionMenu(command=function)传递参数
示例代码
import time
import tkinter as tk
from threading import Thread
def value_change():
value_change.count = 0
value_change.status = False
print('Has the user changed settings in the past 3 seconds?')
while value_change.status != 'exit':
if value_change.status:
value_change.count += 1
# Reset count if no change after 3 seconds
if value_change.count > 3:
value_change.count = 0
value_change.status = False
print(value_change.status)
time.sleep(1)
def function(param=True):
value_change.status = True if param else False
value_change.count = 0
gui = tk.Tk()
gui.geometry('100x100')
"""Setup OptionMenu"""
menu_options = ['var1', 'var2', 'var3']
menu_string = tk.StringVar()
menu_string.set(menu_options[0])
option_menu = tk.OptionMenu(gui, menu_string, *menu_options, command=function)
option_menu.pack()
"""Setup CheckButton"""
check_int = tk.IntVar()
check = tk.Checkbutton(gui, variable=check_int, command=function)
check.pack()
"""Turn On Thread and Run Program"""
Thread(target=value_change).start()
gui.mainloop()
"""Signal Threaded Function to Exit"""
value_change.status = 'exit'
上面的示例是一个最小的复制,我没有包括
OK
Cancel
Apply
按钮及其功能,因为它们不是必需的,只会使代码变长。您可以使用lambda
:
option_menu = tk.OptionMenu(gui, menu_string, *menu_options, command=lambda v: function())
完美的谢谢