[bug]tkinter事件触发

在python的tkinter中,写代码出了bug,找了好半天,记一下。

import tkinter as tk
from tkinter import Frame
from  tkinter import messagebox
from  tkinter import font
window = tk.Tk()#界面
the_width,the_height = window.maxsize()#全屏的长、宽
button_list = list()#按钮列表
each_width_height = 83//9#每个按钮的边长
now_x = 0#当前位置的横坐标(0~8,左侧为x轴,上方为y轴)
now_y = 0

#设置屏幕标题
window.title("阿尔法猪数独")
#设置屏幕大小
window.geometry("{}x{}".format(the_width, the_height))



#字体
f1 = font=('Arial', 12,'bold')
shuzi = "娃哈哈"
#设置标签文字
text = tk.Label(window, text='数独游戏', bg='green',font=('Arial', 12), width=30, height=2,)
#放置标签
text.place(x = 90*12,y = 0)

#事件处理函数
def button1(event):
    #单击鼠标左键
    print("123")
    return 0


#给空数组赋值(空数组赋值一定要用append函数,神器!)
for i in range(81):
    button_list.append(tk.Button(window,text=shuzi,command = button1 ,font = f1,width=each_width_height,height=each_width_height//2))
#摆放按钮位置
for i in range(9):
    for j in range(9):
        button_list[(i * 9 + j)].place(x=j*90,y=i*90)#注意列表坐标顺序,xy颠倒了一下
#对每一个按钮,都把鼠标左键单击事件(即<Button-1>)与自定义的事件处理函数button1绑定
for i in range(9):
    for j in range(9):
        button_list[(i * 9 + j)].bind("<Button-1>",button1)


# 进入消息循环
window.mainloop()

当我随便按一个button时,程序报错。

原因是

button_list[(i * 9 + j)].bind("<Button-1>",button1)

button_list.append(tk.Button(window,text=shuzi,command = button1 ,font = f1,width=each_width_height,height=each_width_height//2))

中的

command = button1

重复了(或者说冲突了)

解决方法要么1要么2:

方法1:去掉

command = button1

方法2:

for i in range(9):
    for j in range(9):
        button_list[(i * 9 + j)].bind("<Button-1>",button1)

这段代码去掉,然后还要把

#事件处理函数
def button1(event):
    #单击鼠标左键
    print("123")
    return 0

括号里的参数event去掉(因为command = button1没有传递参数,所以event要删掉,否则会报错:“button1函数有一个参数,但实际接收了0个”)

很明显,方法2无法传递event,也就是说事件处理函数就不能判断发生的事件的种类了。

posted @ 2020-03-03 15:41  林间飞鹿  阅读(439)  评论(0编辑  收藏  举报