Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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 3.x 当键盘事件发生时,是否有办法将检查按钮添加到tkinter菜单?_Python 3.x_Tkinter_Keyboard Shortcuts_Keyboard Events_Tkinter Menu - Fatal编程技术网

Python 3.x 当键盘事件发生时,是否有办法将检查按钮添加到tkinter菜单?

Python 3.x 当键盘事件发生时,是否有办法将检查按钮添加到tkinter菜单?,python-3.x,tkinter,keyboard-shortcuts,keyboard-events,tkinter-menu,Python 3.x,Tkinter,Keyboard Shortcuts,Keyboard Events,Tkinter Menu,我在tkinter中有一个复选框工具栏菜单选项。每当我点击该选项时,它就会启用自动换行并在旁边打上复选标记 # Toggle Word Wrap Function def ToggleWordWrap(*args): # If there is no word wrap then add word wrap if TextBox.cget("wrap") == "none": TextBox.configure(wrap=&

我在tkinter中有一个复选框工具栏菜单选项。每当我点击该选项时,它就会启用自动换行并在旁边打上复选标记

# Toggle Word Wrap Function
def ToggleWordWrap(*args):
    # If there is no word wrap then add word wrap
    if TextBox.cget("wrap") == "none":
        TextBox.configure(wrap="word")
    # If there is word wrap then take out word wrap
    elif TextBox.cget("wrap") == "word":
        TextBox.configure(wrap="none")

# Check Marks for Options in Tools Menu
WordWrap_CheckMark = BooleanVar()
WordWrap_CheckMark.set(False)

# Tools Option for Menu Bar
ToolsOption = Menu(MenuBar, tearoff=False)
MenuBar.add_cascade(label="Tools", menu=ToolsOption, underline=0)
ToolsOption.add_command(label="Word Count")
ToolsOption.add_checkbutton(label="Toggle Word Wrap", onvalue=1, offvalue=0, variable=WordWrap_CheckMark, command=ToggleWordWrap)
我还决定在函数中添加一个键盘绑定Alt-Z

# Toggle Word Wrap Function
def ToggleWordWrap(*args):
    # If there is no word wrap then add word wrap
    if TextBox.cget("wrap") == "none":
        TextBox.configure(wrap="word")
    # If there is word wrap then take out word wrap
    elif TextBox.cget("wrap") == "word":
        TextBox.configure(wrap="none")
root.bind("<Alt-Key-z>", ToggleWordWrap)

# Check Marks for Options in Tools Menu
WordWrap_CheckMark = BooleanVar()
WordWrap_CheckMark.set(False)

# Tools Option for Menu Bar
ToolsOption = Menu(MenuBar, tearoff=False)
MenuBar.add_cascade(label="Tools", menu=ToolsOption, underline=0)
ToolsOption.add_command(label="Word Count")
ToolsOption.add_checkbutton(label="Toggle Word Wrap", onvalue=1, offvalue=0, variable=WordWrap_CheckMark, command=ToggleWordWrap, accelerator="Alt-Z")
#切换换行功能
def ToggleWordWrap(*args):
#如果没有换行符,则添加换行符
如果TextBox.cget(“wrap”)=“无”:
TextBox.configure(wrap=“word”)
#如果有换行符,请取出换行符
elif TextBox.cget(“wrap”)=“word”:
TextBox.configure(wrap=“无”)
root.bind(“,ToggleWordWrap)
#选中“工具”菜单中的选项
WordWrap_CheckMark=BooleanVar()
WordWrap_复选标记集(False)
#菜单栏的工具选项
ToolsOption=菜单(菜单栏,tearoff=假)
菜单栏.add_级联(label=“Tools”,menu=ToolsOption,underline=0)
ToolsOption.add_命令(label=“字数”)
ToolsOption.add_checkbutton(label=“Toggle Word Wrap”,onvalue=1,offvalue=0,variable=WordWrap_CheckMark,command=ToggleWordWrap,accelerator=“Alt-Z”)

每当我使用键盘绑定时,它都不会打开复选标记。如何修复此问题?

当启用“自动换行”时,您需要将
WordWrap\u复选标记设置为True

以下是您的功能:

def toggleWordWrap(event=None):
   
   if textBox.cget("wrap") == "none":
        textBox.configure(wrap="word")
        WordWrap_CheckMark.set(True)
    # If there is word wrap then take out word wrap

   elif textBox.cget("wrap") == "word":
        textBox.configure(wrap="none")
        WordWrap_CheckMark.set(False)
以下是完整的示例:

from tkinter import *

def toggleWordWrap(event=None):
   
   if textBox.cget("wrap") == "none":
        textBox.configure(wrap="word")
        WordWrap_CheckMark.set(True)
    # If there is word wrap then take out word wrap

   elif textBox.cget("wrap") == "word":
        textBox.configure(wrap="none")
        WordWrap_CheckMark.set(False)

root = Tk()

root.bind_all("<Alt-Key-z>", toggleWordWrap)  # just Alt-z will also work fine

WordWrap_CheckMark = BooleanVar()
WordWrap_CheckMark.set(False)

menuBar = Menu(root)

tools = Menu(menuBar, tearoff=0)
tools.add_command(label='Word Count')
tools.add_checkbutton(label="Toggle Word Wrap", onvalue=1, offvalue=0, variable=WordWrap_CheckMark, command=toggleWordWrap, accelerator="Alt-Z")

menuBar.add_cascade(label ='Tools', menu=tools)

textBox = Text(root, wrap="none")
textBox.pack()

root.config(menu = menuBar)
root.mainloop()

从tkinter导入*
def toggleWordWrap(事件=无):
如果textBox.cget(“wrap”)=“无”:
textBox.configure(wrap=“word”)
WordWrap_复选标记.set(True)
#如果有换行符,请取出换行符
elif textBox.cget(“wrap”)=“word”:
textBox.configure(wrap=“无”)
WordWrap_复选标记集(False)
root=Tk()
root.bind_all(“,toggleWordWrap)#只需Alt-z也可以正常工作
WordWrap_CheckMark=BooleanVar()
WordWrap_复选标记集(False)
菜单栏=菜单(根)
工具=菜单(菜单栏,tearoff=0)
添加命令(label='Word Count')
添加复选按钮(label=“toggleWordWrap”,onvalue=1,offvalue=0,variable=WordWrap\u复选标记,command=toggleWordWrap,accelerator=“Alt-Z”)
菜单栏.add_级联(label='Tools',menu=Tools)
textBox=Text(root,wrap=“无”)
textBox.pack()
root.config(menu=menuBar)
root.mainloop()

@Skcoder当您单击“Toggle Word Wrap”时,它在函数调用过程中不会传递任何参数,而bind方法在函数调用时传递参数,因此您需要为事件参数指定初始值。否则您可能会收到TypeError。要知道传递的参数是什么,请在
toggleWordWrap
函数中使用print(event)。您能解释一下是什么事件,e,*args,event=None-all-do以及它们之间的区别是什么?@Skcoder如果您不了解这里的内容,
toggleWordWrap
只是对函数的引用,而不是函数调用,其中as
toggleWordWrap()
是函数调用,意味着它将立即调用函数。因此这里
command=toggleWordWrap
您只是将引用传递给该方法。事件发生时将进行函数调用。试试这个简单的代码
def函数(string):print(“Hello”,string)def callFun(fun):fun(“run”)callFun(function)
。e、 事件只是名称,可以是任何名称。*在本例中,当函数调用传递未知数量的参数时使用args。希望这能清除一切。另外,你可能想阅读