Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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 你能从tk.OptionMenu';s命令参数,而不传递参数_Python_Tkinter - Fatal编程技术网

Python 你能从tk.OptionMenu';s命令参数,而不传递参数

Python 你能从tk.OptionMenu';s命令参数,而不传递参数,python,tkinter,Python,Tkinter,我想检查用户是否更改了tkinter小部件中的任何值,然后提示保存这些值或丢失更改 许多应用程序在其设置框的右下角有3个按钮,OK、Cancel和Apply,其中Apply被禁用,直到做出更改。我在我的程序中模仿这个功能 当我使用tk.OptionMenu(command=function)时,默认情况下,它会将当前用户选择发送到函数,但是我不需要知道当前选择,因为无论是什么,我都希望提示用户保存设置 运行该程序将导致以下错误: TypeError:函数()接受0个位置参数,但给出了1个 我想到

我想检查用户是否更改了tkinter小部件中的任何值,然后提示保存这些值或丢失更改

许多应用程序在其设置框的右下角有3个按钮,
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())

完美的谢谢