python - 单击时销毁按钮(销毁错误)
问题描述
我有一个按钮网格。右键单击按钮后,目标是在其顶部创建一个带有标志图像的新按钮。然后左键单击该按钮后,我想销毁该新按钮。目前,右键单击部分有效,但是当我左键单击时出现错误“无法调用“销毁”命令:应用程序已被销毁”。我浏览了许多问题和答案,但无法弄清楚。
def flags():
for i in range(0,324):
buttonlist[i].bind("<Button-3>", globals()[rightlist[i]])
def copy_function(fn, name):
return FunctionType(
copy(fn.__code__),
copy(fn.__globals__),
name=name,
argdefs=copy(fn.__defaults__),
closure=copy(fn.__closure__))
for i in range(1,325):
name = 'right' + str(i)
def _right(event):
global flag1
flaglist[i-1] = tk.Button(app, text = "", width=16, height=18, image = flag)
flaglist[i-1].grid(row=rowlist[i-1], column=columnlist[i-1], columnspan=1)
flaglist[i-1].bind("<Button-1>", globals()[leftlist[i-1]])
globals()[name] = copy_function(_right, name)
for i in range(1,325):
name = 'left' + str(i)
def _left(event):
flaglist[i-1].destroy()
globals()[name] = copy_function(_left, name)
解决方案
global()
我认为您使用和复制功能使所有代码过于复杂。
您可以使用lambda
参数分配函数。
因为lambda
在for
-loop 中使用,所以它需要y=row,x=col
将值复制到新变量。如果没有这个,所有按钮都将使用相同的值。
最少的工作代码。
我使用带有文本的按钮X
而不是图像 - 这样每次都可以测试它。
import tkinter as tk
# --- functions ---
def add_button(row, col):
b = tk.Button(root, text=f' X ')
b.grid(row=row, column=col)
b.bind('<Button-3>', lambda event:b.destroy())
# --- main ---
root = tk.Tk()
for row in range(5):
for col in range(5):
b = tk.Button(root, text=f'{row},{col}')
b.grid(row=row, column=col)
b.bind('<Button-1>', lambda event, y=row,x=col:add_button(y,x))
root.mainloop()
其他方法是替换现有按钮中的配置或使用类tk.Button
创建具有所有功能的新类,然后在网格中使用它。
import tkinter as tk
# --- classes ---
class MyButton(tk.Button):
def __init__(self, master, row, col, *args, **kwargs):
super().__init__(master, *args, *kwargs)
self.left_text = f'{row},{col}'
self.right_text = ' X '
self.bind('<Button-1>', self.on_left_click)
self.bind('<Button-3>', self.on_right_click)
self['text'] = self.left_text
self.state ='left'
def on_left_click(self, event):
if self.state == 'left':
self.state = 'right'
self['text'] = self.right_text
def on_right_click(self, event):
if self.state == 'right':
self.state = 'left'
self['text'] = self.left_text
# --- main ---
root = tk.Tk()
for row in range(5):
for col in range(5):
b = MyButton(root, row, col)
b.grid(row=row, column=col)
root.mainloop()
推荐阅读
- php - Laravel 在销毁路线上缺少必需的参数
- linux - 有没有办法让主线程完成自己的任务而不等待它的子线程?
- nginx - nginx rewrite中括号的含义
- material-ui - 如何垂直对齐材质ui复选框
- html - 为什么媒体查询在 Angular8 中不起作用
- reactjs - Fabricjs 无法在“WebGLRenderingContext”上执行“texImage2D”:图像元素包含跨域数据,可能无法加载
- html - 防止父母从孩子成长
- python-3.x - 每个 csv 作为一个训练样例
- css - 如何在antd(白色主题)中实现带有logo和菜单的固定标题?
- c# - 混淆单个 And & 运算符以及如何将其记录在数据库中