再再补充:通过排查发现,是金山词霸造成的。那么新问题出现了:为何会这样,如何避免呢?试了几个windows应用,比如记事本、pycharm都是正常的。
再补充:我的PC是win10专业版。把程序打包后,让同事测试,发现win7、10、11下,菜单都是正常的。这表明不是代码的问题,而应该是环境里有某项冲突所致。而且,因为我的PC上,其他应用程序是正常的,这意味着什么呢?
补充:刚才克隆了别人的一个记事本程序,运行后发现也存在这个问题。他的代码也是只使用了command方式,未使用bind方式。
由此看来,是我PC的环境有问题?
=================================
我正在学习Python中。近期编写了一个tkinter程序,但是遇到一个菜单方面的异常:当点击菜单时,子菜单能出现,但是一但松开鼠标左键,菜单就消失了。不过如果一直按住左键,把光标移动到菜单项上再释放,功能可以正常实现。
代码反复查看过多次,网上也没找到同类问题。请各位指点。多谢
下面是那部分代码(完整代码太多,此处是Menu那部分)
```python
# menu开始
## 创建菜单栏
menubar = tk.Menu(root, type="menubar")
## 创建菜单栏的子菜单对象
menu_file = tk.Menu(menubar, tearoff=False, type="normal")
menu_edit = tk.Menu(menubar, tearoff=False, type="normal")
menu_about = tk.Menu(menubar, tearoff=False, type="normal")
menubar.add_cascade(label='文件', menu=menu_file) # 把子菜单menu_file挂装到菜单栏
menubar.add_cascade(label='编辑', menu=menu_edit) # 把子菜单menu_edit挂装到菜单栏
menu_file.add_command(label='导出当前页', command=exportRec) # 在menu_file子菜单中添加命令项‘导出’
menu_file.add_command(label='退出', command=root.destroy) # 在menu_file子菜单中添加命令项‘退出’
menu_file.add_separator()
menu_file.add_command(label="About", command=showAbout) # 在子菜单menu_file中添加一个命令“显示关于信息弹窗”
menu_edit.add_command(label="添加记录", command=addRec) # 在子菜单menu_edit上添加一个命令"添加记录"
# 把完成装配的菜单(窗帘),挂到root(墙)上去
root["menu"] = menubar
# menu完成
```
菜单事件绑定应该使用 bind 方法,而不是 command 属性。你可以尝试给菜单添加绑定事件,看是否能解决这个问题。例如,在 menu_file 中添加以下代码:
menu_file.bind("<ButtonRelease-1>", lambda event: menu_file.post(event.x_root, event.y_root))
如果这个方法没有解决你的问题,你可能需要检查其他部分的代码,特别是是否有代码在事件处理函数中阻止了菜单正常显示。
回答不易 求求您采纳哦
根据您的描述,可能是您在单击菜单时没有释放鼠标左键,或者鼠标左键的释放事件没有被正确处理,导致菜单消失。为了解决这个问题,您可以尝试在菜单上绑定 事件来捕捉鼠标左键的释放事件,如下所示:
menu_file.bind("<ButtonRelease-1>", lambda event: menu_file.event_generate("<Button-1>", x=event.x, y=event.y))
menu_edit.bind("<ButtonRelease-1>", lambda event: menu_edit.event_generate("<Button-1>", x=event.x, y=event.y))
menu_about.bind("<ButtonRelease-1>", lambda event: menu_about.event_generate("<Button-1>", x=event.x, y=event.y))
这些代码将在菜单 menu_file、menu_edit 和 menu_about 上绑定 事件,并在事件触发时手动触发 事件。这样,当您单击菜单并松开鼠标左键时, 事件将被捕获并转换为 事件,从而正确处理菜单项的选择。
您还可以尝试使用 事件的绑定来绑定一个回调函数来处理鼠标左键的释放事件,从而更精细地控制菜单的行为。